crypto-lite 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Manifest.txt +2 -1
- data/README.md +63 -9
- data/Rakefile +1 -0
- data/lib/crypto-lite.rb +92 -7
- data/lib/crypto-lite/version.rb +1 -1
- data/test/test_hash_keccak.rb +25 -0
- data/test/{test_hash.rb → test_hash_sha.rb} +1 -1
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8380b7856889a9c184423b31a39b84dff8197bcb34a58687cd8d496bf7ded819
|
4
|
+
data.tar.gz: b91ff4cb4baaa9a7de69224e99585ad5efa6491bb2d8e54adf36841675dfd00c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37c7deea2e4badbeb25abd89e4df6ad98f9503c5b8c7fc22f14bd141d2036d97aa33b2fd9c00f538490c9eb6e5eb4fa554199574948b893691c5bf1dfab34fd0
|
7
|
+
data.tar.gz: 8727fbeea1fa393124ff0d302d1e0f11cc88517424cefba0e809c1f7d1685a758cf0e60eff2d978355da158fd4cb55bea4190f0368eae327d43124ef7d6fe7b6
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -12,21 +12,21 @@
|
|
12
12
|
|
13
13
|
### Secure Hashing / Hash Functions
|
14
14
|
|
15
|
-
SHA256 - Secure Hash Algorithm (SHA) 256-
|
15
|
+
**SHA256 - Secure Hash Algorithm (SHA) 256-Bits (32 Bytes)**
|
16
16
|
|
17
17
|
|
18
18
|
``` ruby
|
19
19
|
require 'crypto' ## or use require 'crypto-lite'
|
20
20
|
|
21
21
|
## try abc
|
22
|
-
sha256( "abc" )
|
23
|
-
sha256( "abc".b )
|
24
|
-
sha256( "\x61\x62\x63" )
|
25
|
-
sha256( 0x616263 )
|
22
|
+
sha256( "abc" ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
23
|
+
sha256( "abc".b ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
24
|
+
sha256( "\x61\x62\x63" ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
25
|
+
sha256( 0x616263 ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
sha256hex( '616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
28
|
+
sha256hex( '0x616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
29
|
+
sha256hex( '0X616263' ) #=> "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
|
30
30
|
|
31
31
|
|
32
32
|
## try a
|
@@ -45,10 +45,64 @@ sha256( "Hello, Cryptos!" ) #=> "33eedea60b0662c66c289ceba71863a864cf84b00e1000
|
|
45
45
|
|
46
46
|
|
47
47
|
|
48
|
+
**Keccak 256-Bit**
|
49
|
+
|
50
|
+
``` ruby
|
51
|
+
keccak256( "Hello, Cryptos!" ) #=> "2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5"
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
**RMD - RACE¹ Integrity Primitives Evaluation Message Digest 160-Bit**
|
56
|
+
|
57
|
+
¹: Research and development in Advanced Communications technologies in Europe
|
58
|
+
|
59
|
+
|
60
|
+
``` ruby
|
61
|
+
rmd160( "Hello, Cryptos!" ) #=>"4d65f7b740bbade4097e1348e15d2a7d52ac5f53"
|
62
|
+
```
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
#### Helpers
|
67
|
+
|
68
|
+
**HASH160 - RMD160(SHA256())**
|
69
|
+
|
70
|
+
All-in-one "best-of-both-worlds" helper - first hash with sha256 and than hash with rmd160. Why? Get the higher security of sha256 and the smaller size of rmd160.
|
71
|
+
|
72
|
+
|
73
|
+
``` ruby
|
74
|
+
hash160hex( '02b9d1cc0b793b03b9f64d022e9c67d5f32670b03f636abf0b3147b34123d13990' )
|
75
|
+
=> "e6b145a3908a4d6616b13c1109717add8672c900"
|
76
|
+
|
77
|
+
hash160hex( '02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737' )
|
78
|
+
=> "93ce48570b55c42c2af816aeaba06cfee1224fae"
|
79
|
+
```
|
80
|
+
|
81
|
+
Why hex? The input string is a hex string.
|
82
|
+
Note: It's optional to start a hex string with `0x` or `0X`.
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
**HASH256 - SHA256(SHA256())**
|
87
|
+
|
88
|
+
All-in-one double sha256 hash helper, that is, first hash with sha256 and than hash with sha256 again. Why? Arguably higher security.
|
89
|
+
|
90
|
+
``` ruby
|
91
|
+
hash256hex( '6fe6b145a3908a4d6616b13c1109717add8672c900' )
|
92
|
+
=> "02335f08b8fe4ddad263a50b7a33c5d38ea1cbd8fd2056a1320a3ddece541711"
|
93
|
+
```
|
94
|
+
|
95
|
+
|
96
|
+
Why hex? The input string is a hex string.
|
97
|
+
Note: It's optional to start a hex string with `0x` or `0X`.
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
48
102
|
|
49
103
|
### Public Key Signature Algorithms
|
50
104
|
|
51
|
-
RSA - Rivest
|
105
|
+
**RSA - Rivest, Shamir and Adleman**
|
52
106
|
|
53
107
|
|
54
108
|
|
data/Rakefile
CHANGED
data/lib/crypto-lite.rb
CHANGED
@@ -3,6 +3,15 @@ require 'digest'
|
|
3
3
|
require 'base64'
|
4
4
|
require 'openssl'
|
5
5
|
|
6
|
+
## 3rd party gems
|
7
|
+
require 'digest/sha3' # e.g. keccak (original submission/proposal NOT official sha3)
|
8
|
+
## see https://rubygems.org/gems/digest-sha3-patched
|
9
|
+
## https://github.com/teamhedge/digest-sha3-ruby
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
|
6
15
|
|
7
16
|
## our own code
|
8
17
|
require 'crypto-lite/version' # note: let version always go first
|
@@ -11,7 +20,8 @@ require 'crypto-lite/version' # note: let version always go first
|
|
11
20
|
|
12
21
|
module Crypto
|
13
22
|
|
14
|
-
|
23
|
+
|
24
|
+
def self.message( input ) ## convert input to (binary) string
|
15
25
|
input_type = if input.is_a?( String )
|
16
26
|
"#{input.class.name}/#{input.encoding}"
|
17
27
|
else
|
@@ -28,13 +38,42 @@ module Crypto
|
|
28
38
|
input
|
29
39
|
end
|
30
40
|
|
41
|
+
bytes = message.bytes
|
42
|
+
bin = bytes.map {|byte| byte.to_s(2).rjust(8, "0")}.join( ' ' )
|
43
|
+
hex = bytes.map {|byte| byte.to_s(16).rjust(2, "0")}.join( ' ' )
|
44
|
+
puts " #{pluralize( bytes.size, 'byte')}: #{bytes.inspect}"
|
45
|
+
puts " binary: #{bin}"
|
46
|
+
puts " hex: #{hex}"
|
47
|
+
|
48
|
+
message
|
49
|
+
end
|
50
|
+
|
31
51
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
52
|
+
|
53
|
+
def self.keccak256bin( input )
|
54
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
55
|
+
Digest::SHA3.digest( message, 256 )
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.keccak256( input )
|
59
|
+
keccak256bin( input ).unpack( 'H*' )[0]
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def self.rmd160bin( input )
|
64
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
65
|
+
Digest::RMD160.digest( message )
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.rmd160( input )
|
69
|
+
rmd160bin( input ).unpack( 'H*' )[0]
|
70
|
+
end
|
71
|
+
## todo/fix: add alias RIPEMD160 - why? why not?
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def self.sha256bin( input, engine=nil ) ## todo/check: add alias sha256b or such to - why? why not?
|
76
|
+
message = message( input ) ## "normalize" / convert to (binary) string
|
38
77
|
|
39
78
|
if engine && ['openssl'].include?( engine.to_s.downcase )
|
40
79
|
puts " engine: #{engine}"
|
@@ -65,6 +104,44 @@ module Crypto
|
|
65
104
|
|
66
105
|
|
67
106
|
|
107
|
+
####
|
108
|
+
## helper
|
109
|
+
# def hash160( pubkey )
|
110
|
+
# binary = [pubkey].pack( "H*" ) # Convert to binary first before hashing
|
111
|
+
# sha256 = Digest::SHA256.digest( binary )
|
112
|
+
# ripemd160 = Digest::RMD160.digest( sha256 )
|
113
|
+
# ripemd160.unpack( "H*" )[0] # Convert back to hex
|
114
|
+
# end
|
115
|
+
|
116
|
+
def self.hash160hex( input )
|
117
|
+
## convenience helper - lets you pass in hex string
|
118
|
+
|
119
|
+
## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
120
|
+
if input.start_with?( '0x') || input.start_with?( '0X' )
|
121
|
+
input = input[2..-1]
|
122
|
+
end
|
123
|
+
|
124
|
+
raise ArgumentError, "expected hex string (0-9a-f) - got >#{input}< - can't pack string; sorry" if input.downcase =~ /[^0-9a-f]/
|
125
|
+
sha256bin = sha256bin( [input].pack( 'H*' ) )
|
126
|
+
rmd160 = rmd160bin( sha256bin ).unpack( "H*" )[0]
|
127
|
+
rmd160
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.hash256hex( input )
|
131
|
+
## convenience helper - lets you pass in hex string
|
132
|
+
|
133
|
+
## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
134
|
+
if input.start_with?( '0x') || input.start_with?( '0X' )
|
135
|
+
input = input[2..-1]
|
136
|
+
end
|
137
|
+
|
138
|
+
raise ArgumentError, "expected hex string (0-9a-f) - got >#{input}< - can't pack string; sorry" if input.downcase =~ /[^0-9a-f]/
|
139
|
+
sha256bin = sha256bin( [input].pack( 'H*' ) )
|
140
|
+
sha256 = sha256bin( sha256bin ).unpack( "H*" )[0]
|
141
|
+
sha256
|
142
|
+
end
|
143
|
+
|
144
|
+
|
68
145
|
def self.pluralize( count, noun )
|
69
146
|
count == 1 ? "#{count} #{noun}" : "#{count} #{noun}s"
|
70
147
|
end
|
@@ -105,6 +182,14 @@ end # module Crypto
|
|
105
182
|
def sha256( input, engine=nil ) Crypto.sha256( input, engine ); end
|
106
183
|
def sha256hex( input, engine=nil ) Crypto.sha256hex( input, engine ); end
|
107
184
|
|
185
|
+
def keccak256( input ) Crypto.keccak256( input ); end
|
186
|
+
|
187
|
+
def rmd160( input ) Crypto.rmd160( input ); end
|
188
|
+
|
189
|
+
def hash160hex( input ) Crypto.hash160hex( input ); end
|
190
|
+
def hash256hex( input ) Crypto.hash256hex( input ); end
|
191
|
+
|
192
|
+
|
108
193
|
RSA = Crypto::RSA
|
109
194
|
|
110
195
|
|
data/lib/crypto-lite/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_hash_keccak.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestHashKeccak < MiniTest::Test
|
10
|
+
|
11
|
+
KECCAK256_EMPTY = 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'
|
12
|
+
KECCAK256_TESTING = '5f16f4c7f149ac4f9510d9cf8cf384038ad348b3bcdc01915f95de12df9d1b02'
|
13
|
+
KECCAK256_HELLO_CRYPTOS = '2cf14baa817e931f5cc2dcb63c889619d6b7ae0794fc2223ebadf8e672c776f5'
|
14
|
+
|
15
|
+
|
16
|
+
def test_empty
|
17
|
+
assert_equal KECCAK256_EMPTY, keccak256( '' )
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_misc
|
21
|
+
assert_equal KECCAK256_TESTING, keccak256( 'testing' )
|
22
|
+
assert_equal KECCAK256_HELLO_CRYPTOS, keccak256( 'Hello, Cryptos!' )
|
23
|
+
end
|
24
|
+
|
25
|
+
end # class TestHashKeccak
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crypto-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: digest-sha3-patched
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rdoc
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -63,7 +77,8 @@ files:
|
|
63
77
|
- lib/crypto.rb
|
64
78
|
- lib/crypto/lite.rb
|
65
79
|
- test/helper.rb
|
66
|
-
- test/
|
80
|
+
- test/test_hash_keccak.rb
|
81
|
+
- test/test_hash_sha.rb
|
67
82
|
- test/test_version.rb
|
68
83
|
homepage: https://github.com/rubycoco/blockchain
|
69
84
|
licenses:
|