crypto-toolbox 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1123ac6ed9d5331c0c2201ba341b68a9841cbe92
|
4
|
+
data.tar.gz: 10885b70c101833936c9b687150737738e9e0d33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49add99b4bbba46bb5c7f25830a4eeeb52f2b9ab784edf1b8e2e9f572cba52b7085476494a2071b086ea14f4bcb95d55ed5a3cdd3f74f26f4d38304cd8aeab20
|
7
|
+
data.tar.gz: ad20f731508e0a281dc088775d05ca0973f80dcc61b2d1a9ab96b4195b5a055f14c1e2c494cdfb573567511bfd935fd02e0ab29e76b1c678081296446103d869
|
data/lib/crypto-toolbox.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
require 'crypto-toolbox/utils/reporting/console.rb'
|
3
3
|
require 'crypto-toolbox/utils/hamming_distance_filter.rb'
|
4
|
+
require 'crypto-toolbox/utils/ecb_detector.rb'
|
4
5
|
|
5
6
|
require 'crypto-toolbox/crypt_buffer_input_converter.rb'
|
6
7
|
require 'crypto-toolbox/crypt_buffer.rb'
|
@@ -11,7 +12,6 @@ require 'crypto-toolbox/analyzers/utils/ascii_language_detector.rb'
|
|
11
12
|
require 'crypto-toolbox/analyzers/utils/spell_checker.rb'
|
12
13
|
require 'crypto-toolbox/analyzers/utils/human_language_detector.rb'
|
13
14
|
|
14
|
-
|
15
15
|
require 'crypto-toolbox/analyzers/padding_oracle.rb'
|
16
16
|
require 'crypto-toolbox/analyzers/cbc_mac.rb'
|
17
17
|
require 'crypto-toolbox/analyzers/vigenere_xor.rb'
|
@@ -22,4 +22,5 @@ require 'crypto-toolbox/ciphers/rot13.rb'
|
|
22
22
|
|
23
23
|
require 'crypto-toolbox/forgers/stream_ciphers/forge_generator.rb'
|
24
24
|
|
25
|
+
|
25
26
|
require 'crypto-toolbox/crypto_challanges/solver.rb'
|
@@ -5,13 +5,60 @@ module Ciphers
|
|
5
5
|
@cipher = OpenSSL::Cipher::AES.new(keysize,mode)
|
6
6
|
end
|
7
7
|
|
8
|
-
def decipher_ecb(input
|
8
|
+
def decipher_ecb(key,input)
|
9
9
|
@cipher.decrypt
|
10
10
|
@cipher.key = key
|
11
11
|
(@cipher.update(input) + @cipher.final)
|
12
12
|
end
|
13
|
+
|
14
|
+
def encipher_ecb(key,input)
|
15
|
+
@cipher.encrypt
|
16
|
+
@cipher.key = key
|
17
|
+
|
18
|
+
encipher_ecb_blockwise(@cipher,CryptBuffer(input).chunks_of(16)) + @cipher.final
|
19
|
+
end
|
13
20
|
|
14
|
-
def
|
21
|
+
def encipher_cbc(key,input,iv: nil)
|
22
|
+
blocks = CryptBuffer(input).chunks_of(16)
|
23
|
+
iv ||= blocks.shift.str
|
24
|
+
k = CryptBuffer(key).hex
|
25
|
+
xor_input=iv.to_crypt_buffer
|
26
|
+
|
27
|
+
data = blocks.map do |block|
|
28
|
+
xored = xor_input ^ block
|
29
|
+
|
30
|
+
_,out = AES.encrypt(xored.str, k, {:format => :plain,:padding => false,:cipher => "AES-128-ECB",:iv => xor_input.str })
|
31
|
+
ecb_block = CryptBuffer(out)
|
32
|
+
xor_input = ecb_block
|
33
|
+
ecb_block.str
|
34
|
+
end.join
|
35
|
+
(data).to_crypt_buffer
|
36
|
+
end
|
37
|
+
|
38
|
+
def decipher_cbc(key,input,iv: nil)
|
39
|
+
blocks = CryptBuffer(input).chunks_of(16)
|
40
|
+
iv ||= blocks.shift.str
|
41
|
+
k = CryptBuffer(key).hex
|
42
|
+
xor_input=iv.to_crypt_buffer
|
43
|
+
|
44
|
+
data = blocks.map do |block|
|
45
|
+
out = ::AES.decrypt([xor_input.str,block.str] , k, {:format => :plain,:padding => false,:cipher => "AES-128-ECB",:iv => xor_input.str })
|
46
|
+
ecb_block = CryptBuffer(out)
|
47
|
+
result = ecb_block ^ xor_input
|
48
|
+
xor_input = block
|
49
|
+
result.str
|
50
|
+
end.join
|
51
|
+
(data).to_crypt_buffer
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def encipher_ecb_blockwise(crypter,blocks)
|
56
|
+
blocks.map{|block| encipher_ecb_block(block) }.join
|
57
|
+
end
|
58
|
+
|
59
|
+
def encipher_ecb_block(crypter,block)
|
60
|
+
crypter.update(block.str)
|
15
61
|
end
|
16
62
|
end
|
17
63
|
end
|
64
|
+
|
@@ -40,22 +40,20 @@ module CryptoChallanges
|
|
40
40
|
|
41
41
|
def solve7(input,key)
|
42
42
|
data = CryptBuffer.from_base64(input).str
|
43
|
-
Ciphers::Aes.new(128,:ECB).decipher_ecb(data
|
43
|
+
Ciphers::Aes.new(128,:ECB).decipher_ecb(key,data)
|
44
44
|
end
|
45
45
|
|
46
46
|
def solve8(ciphers)
|
47
|
-
ciphers.
|
48
|
-
if c.chunks_of(16).map(&:bytes).uniq.length < c.chunks_of(16).length
|
49
|
-
[i,c]
|
50
|
-
else
|
51
|
-
nil
|
52
|
-
end
|
53
|
-
# only resturn the first none nil value => compact.first
|
54
|
-
end.compact.first
|
47
|
+
Utils::EcbDetector.new.detect(ciphers).first
|
55
48
|
end
|
56
49
|
|
57
50
|
def solve9(input)
|
58
51
|
CryptBuffer(input).pad(4).str
|
59
52
|
end
|
53
|
+
|
54
|
+
def solve10(key,input,iv)
|
55
|
+
data = CryptBuffer.from_base64(input).str
|
56
|
+
Ciphers::Aes.new(128,:ECB).decipher_cbc(key,data,iv: iv).str
|
57
|
+
end
|
60
58
|
end
|
61
59
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Utils
|
2
|
+
class EcbDetector
|
3
|
+
def detect(ciphers)
|
4
|
+
result = ciphers.map.with_index{|c,i| detect_ecb_entry(c,i) }
|
5
|
+
sanitize_result(result)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def sanitize_result(result)
|
11
|
+
result.reject(&:empty?)
|
12
|
+
end
|
13
|
+
|
14
|
+
# search for any chunks whose byte-pattern occours more than once,
|
15
|
+
# in that case the number of entries is reduced by uniq
|
16
|
+
def duplicate_chunk?(chunks)
|
17
|
+
chunks.map(&:bytes).uniq.length < chunks.length
|
18
|
+
end
|
19
|
+
|
20
|
+
def detect_ecb_entry(ciphertext,index)
|
21
|
+
if duplicate_chunk?(ciphertext.chunks_of(16))
|
22
|
+
[index,ciphertext]
|
23
|
+
else
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crypto-toolbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dennis Sivia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aes
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- lib/crypto-toolbox/crypt_buffer_input_converter.rb
|
83
83
|
- lib/crypto-toolbox/crypto_challanges/solver.rb
|
84
84
|
- lib/crypto-toolbox/forgers/stream_ciphers/forge_generator.rb
|
85
|
+
- lib/crypto-toolbox/utils/ecb_detector.rb
|
85
86
|
- lib/crypto-toolbox/utils/hamming_distance_filter.rb
|
86
87
|
- lib/crypto-toolbox/utils/reporting/console.rb
|
87
88
|
homepage: https://github.com/scepticulous/crypto-toolbox
|