crypto-toolbox 0.1.17 → 0.1.18

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: 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