crypto-toolbox 0.1.17 → 0.1.18

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3c529ed8b701c009002b4b9403f64034576b5af9
4
- data.tar.gz: 7769523cf65f54fecc8e2f3e920a96d2bed93594
3
+ metadata.gz: 37d4aab806c87b5df97642e506ea938733be2b79
4
+ data.tar.gz: 0527ceaba2da2046e998194405f3b7d5a48394d7
5
5
  SHA512:
6
- metadata.gz: 28b5161e37b409bfae0d46955e3aa51b5ab8761157911314752e149d1aa0785a84dfb529b4b8cb0f8fd7c5812772996a8effef468f432ee6f98e3f65f85333c8
7
- data.tar.gz: 714d3cfb1302dee2e227246bf83ff082218db3a5c74dc4d697f72ebf917a893f6bb3c107f77a3f0d6a60587f798c311c18b0c008789595869bd9d53414251e39
6
+ metadata.gz: f5e20456aa954a252cf3c7407ecacbabb1cd09c53fbaa5773fc0468283f18a5a2f80a4ded360e83bffe84b7cd058120194fbb2191c04f915d23eaba0c5bb070d
7
+ data.tar.gz: 8e41fdd52797f51022df4a97abc30320df50e95f29038ffb96e844ee74fb53d4d7aa681eaf80aa99168f05d142cc4234efbc5856559ded55ad7c7016066dcc2e
@@ -15,11 +15,16 @@ module Analyzers
15
15
  @oracle = oracle_class.new
16
16
  end
17
17
 
18
-
18
+ # start with the second to last block to manipulate the final block ( cbc xor behaviour )
19
+ # from there on we move to the left until we have used the first block (iv) to decrypt
20
+ # the second blick ( first plain text block )
21
+ #
22
+ # we have to manipulate the block before the one we want to change
23
+ # xxxxxxxxx xxxxxxxxx xxxxxxxxxx
24
+ # changing this byte ^- will change ^- this byte at decryption
19
25
  def analyze(cipher)
20
26
  blocks = CryptBuffer.from_hex(cipher).chunks_of(16)
21
27
 
22
- # start with the second to last block to manipulate the final block ( cbc xor behaviour )
23
28
  (blocks.length - 1).downto(1) do |block_index|
24
29
  result_part = []
25
30
  # manipulate each byte of the 16 byte block
@@ -50,10 +55,8 @@ module Analyzers
50
55
  def apply_found_bytes(buf,cur_result,pad_index)
51
56
  # first we have to apply all the already found bytes
52
57
 
53
-
54
58
  # NOTE: to easily xor all already found byte and the current padding value
55
59
  # We build up a byte-array with all the known values and "left-pad" them with zeros
56
-
57
60
  other = ([0] * ( buf.length - cur_result.length)) + cur_result.map{|x| x ^ pad_index }
58
61
  # => [0,0,0,...,cur[n] ^ pad_index,... ]
59
62
  buf.xor(other)
@@ -64,22 +67,18 @@ module Analyzers
64
67
  #iv, first, second, last
65
68
  jot(cur_result.inspect,debug: true)
66
69
 
67
- # create a copy to mess with without changing to current block
68
- forge_buf = blocks[block_index - 1].dup
69
-
70
- forge_buf = apply_found_bytes(forge_buf,cur_result,pad_index)
70
+ # apply all the current-result bytes to the block corresponding to <block_index>
71
+ # and store the result in a buffer we will mess with
72
+ #
73
+ forge_buf = apply_found_bytes(blocks[block_index - 1],cur_result,pad_index)
71
74
 
72
75
  1.upto 256 do |guess|
73
- bytes = forge_buf.bytes.dup
74
- new_byte = forge_buf[-1 * pad_index] ^ guess ^ pad_index
76
+ # the bytes from the subset we will send to the padding oracle
77
+ subset = blocks[0,block_index+1]
78
+ subset[block_index -1 ] = forge_buf.xor_at([guess,pad_index], -1 * pad_index)
79
+
80
+ input = subset.map(&:bytes).flatten
75
81
 
76
- bytes[-1 * pad_index] = new_byte
77
-
78
- oracle_blocks = blocks[0,block_index+1].map(&:bytes)
79
- oracle_blocks[block_index -1 ] = bytes
80
-
81
- input = oracle_blocks.flatten
82
-
83
82
  # skip the first correct guess on the first iteration of the first block
84
83
  # otherwise the resulting ciphertext would eq the original input
85
84
  #next if input == blocks.map(&:bytes).flatten
@@ -26,16 +26,16 @@ module Analyzers
26
26
  end
27
27
 
28
28
  def valid_padding?(input,block_amount)
29
- ret = send_msg(input, block_amount)
30
- !ret.zero?
29
+ ! send_msg(input, block_amount).zero?
31
30
  end
32
31
 
33
32
  private
34
33
  def send_msg(input,block_amount)
35
34
  connect unless connected?
36
35
 
37
- msg = ([block_amount] + input + [0]).map(&:chr)
38
- @socket.write(msg.join(""))
36
+ msg = ([block_amount] + input + [0]).map(&:chr).join
37
+ sleep 0.01
38
+ @socket.write(msg)
39
39
  @socket.read(2).to_i
40
40
  end
41
41
  def connected?
@@ -46,6 +46,3 @@ module Analyzers
46
46
  end
47
47
  end
48
48
  end
49
-
50
-
51
-
@@ -28,6 +28,14 @@ Some statistics about it:
28
28
  words = str.split(" ").select{|w| @dict.check?(w) }
29
29
  end
30
30
 
31
+ def human_word?(str)
32
+ @dict.check?(str)
33
+ end
34
+
35
+ def human_phrase?(string)
36
+ string.split(" ").all?{|part| human_word?(part)}
37
+ end
38
+
31
39
  def suggest(str)
32
40
  @dict.suggest(str)
33
41
  end
@@ -69,11 +69,6 @@ class CryptBuffer
69
69
  def chunks_of(n)
70
70
  self.bytes.each_slice(n).map{|chunk| CryptBuffer(chunk) }
71
71
  end
72
-
73
- private
74
- def xor_multiple(byte,bytes)
75
- ([byte] + bytes).reduce(:^)
76
- end
77
72
  end
78
73
 
79
74
 
@@ -13,7 +13,8 @@ module CryptBufferConcern
13
13
  when true
14
14
  # map our current data to xor all inputs with the given bytepos.
15
15
  # all other bytes are kept as they were
16
- tmp = bytes.map.with_index{|b,i| i == pos ? xor_multiple(b,input.to_ary) : b }
16
+ abs_pos = normalize_pos(pos)
17
+ tmp = bytes.map.with_index{|b,i| i == abs_pos ? xor_multiple(b,input.to_ary) : b }
17
18
  CryptBuffer(tmp)
18
19
  else
19
20
  tmp = bytes
@@ -50,6 +51,17 @@ module CryptBufferConcern
50
51
  x = hex2bytes(hex)
51
52
  xor_bytes(x)
52
53
  end
54
+
55
+ private
56
+ def xor_multiple(byte,bytes)
57
+
58
+ ([byte] + bytes).reduce(:^)
59
+ end
60
+ def normalize_pos(pos)
61
+ (pos < 0) ? (length() + pos ) : pos
62
+ end
63
+
64
+
53
65
  end
54
66
 
55
67
  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.1.17
4
+ version: 0.1.18
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-04 00:00:00.000000000 Z
11
+ date: 2015-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aes