crypto-toolbox 0.1.12 → 0.1.13

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: 892b1c0437402343855d625ad56512dbb7ea973a
4
- data.tar.gz: afb0e92074b090c3fc5c252e9fdd00b3cf94659d
3
+ metadata.gz: 6d44c3eb26aa94b3c7b941235ae67cfd42d1d7e4
4
+ data.tar.gz: 9e9c64094502898955d362e5fe5ff30d7563c056
5
5
  SHA512:
6
- metadata.gz: 605c120ec492c10472f7119b62f46217b062d268a9c07818ea96da31365f3dd8cd392ef04e2d0278e321cb3271f17021afa66cec14af583e9f1de5b4620bfc53
7
- data.tar.gz: 10cb8542f4a3fdf662622be45d03a417a336e968a5dee04317b5afc855e3e5165465f3ed8ec14fdee6ea833fb2312ae3a73d754ec3ba0f4fdd8e0e168746eb62
6
+ metadata.gz: 6b72ad40abe63b30723d5bc392ab470cdca4e4bf9d24fa5fbf7ad2ecb1b280b5a1d66c8753a548a9922c9df61e834e7f61d77bfd888fd6dd5780baf5ce862883
7
+ data.tar.gz: be527c12832e261bc5223262034ac8774b030383cb9ba1b28f751417ca68cb990e3f83e06f7951225c57a2d429ed4a3e12d9defc4a0acb3dd5c94de47b54aa1c
@@ -6,6 +6,7 @@ require 'crypto-toolbox/crypt_buffer.rb'
6
6
  require 'crypto-toolbox/analyzers/utils/key_filter.rb'
7
7
  require 'crypto-toolbox/analyzers/utils/spell_checker.rb'
8
8
  require 'crypto-toolbox/analyzers/padding_oracle.rb'
9
+ require 'crypto-toolbox/analyzers/cbc_mac.rb'
9
10
  require 'crypto-toolbox/analyzers/vigenere_xor.rb'
10
11
 
11
12
 
@@ -0,0 +1 @@
1
+ require 'crypto-toolbox/analyzers/cbc_mac/variable_length/analyzer.rb'
@@ -0,0 +1,64 @@
1
+ require 'crypto-toolbox/analyzers/cbc_mac/variable_length/oracles/tcp.rb'
2
+
3
+ module Analyzers
4
+ module CbcMac
5
+ module VariableLength
6
+
7
+ class Analyzer
8
+ # This class implements an attack on CBC-MAC with variable length.
9
+ # This issue is known for a long time and thus should be avoided by any implementation.
10
+ # However this code shows how to forge a tag in this mode and can be seen das a PoC.
11
+ #
12
+ #
13
+ # Thanks to Matthew Green for this great article about the potential implementation problems
14
+ # of CBC-MAC: http://blog.cryptographyengineering.com/2013/02/why-i-hate-cbc-mac.html
15
+ #
16
+ # This class has the VL (variable length) suffix it its name
17
+ # to make100% clear that this attack works only on this condition
18
+ def initialize(oracle_class = ::Analyzers::CbcMac::VariableLength::Oracles::Tcp,block_length=32)
19
+ @oracle = oracle_class.new
20
+ end
21
+ # NOTE: handle too short messages properly
22
+
23
+ def analyze(target_message)
24
+ @oracle.connect
25
+
26
+ #target_msg = "I, the server, hereby agree that I will pay $100 to this student"
27
+ target_bufs = CryptBuffer(target_message).chunks_of(32)
28
+
29
+ # add to_crypt_buffer to String!
30
+ target_tag1 = CryptBuffer(@oracle.mac(target_bufs[0].chars,target_bufs[0].length)) #.split("").map{|i| i.bytes.first }
31
+
32
+ # NOTE t'' = m || [ (m_1' + t ) ||m_2'||...||m_x']
33
+ m2_blocks = target_bufs[1].chunks_of(16)
34
+ msg2 = CryptBuffer((m2_blocks[0].xor(target_tag1)).bytes + m2_blocks[1].bytes)
35
+
36
+ # @oracle.tag_for(msg2.chars,msg2.length)
37
+ forge_tag = @oracle.mac(msg2.chars,msg2.length)
38
+
39
+ # @oracle.verify(target_msg.chars, target_msg.length, forge_tag)
40
+ ret = @oracle.verify(target_message.chars, target_message.length, forge_tag)
41
+
42
+
43
+ if forge_successfull?(ret)
44
+ puts "result is: #{CryptBuffer(forge_tag).hex}"
45
+ puts "Message verified successfully!"
46
+ else
47
+ puts "Message verification failed."
48
+ end
49
+ @oracle.disconnect
50
+ end
51
+
52
+ private
53
+
54
+ def forge_successfull?(retval)
55
+ retval == 1
56
+ end
57
+
58
+ end
59
+
60
+
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,55 @@
1
+ require 'socket'
2
+
3
+ module Analyzers
4
+ module CbcMac
5
+ module VariableLength
6
+ module Oracles
7
+ class Tcp
8
+ def initialize(mac_host = '54.165.60.84', mac_port = 81, verify_host = '54.165.60.84', verify_port = 82)
9
+ @mac_host = mac_host
10
+ @mac_port = mac_port
11
+ @verify_host = verify_host
12
+ @verify_port = verify_port
13
+ @mac_socket = nil
14
+ @verify_socket = nil
15
+ end
16
+ def connect
17
+ @mac_socket = TCPSocket.open(@mac_host,@mac_port)
18
+ @verify_socket = TCPSocket.open(@verify_host,@verify_port)
19
+ #puts "Connected to server successfully."
20
+ end
21
+ def disconnect
22
+ @verify_socket.close if @verfiy_socket
23
+ @mac_socket.close if @mac_socket
24
+ end
25
+
26
+ def mac(message,len)
27
+ connect unless @mac_socket
28
+
29
+ packet = ([message.length] + message + [0]).map(&:chr).join("")
30
+
31
+ @mac_socket.write(packet)
32
+ @mac_socket.read(16)
33
+ end
34
+
35
+ def verify(message,len,tag)
36
+ connect unless @verify_socket
37
+
38
+ # Message-length + message-chars + tag-chars + 0
39
+ packet = ([message.length] + message + tag.split("") + [0]).map(&:chr).join("")
40
+
41
+ @verify_socket.write(packet)
42
+ @verify_socket.read(2).to_i
43
+ end
44
+
45
+
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+
54
+
55
+
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.12
4
+ version: 0.1.13
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-04-23 00:00:00.000000000 Z
11
+ date: 2015-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aes
@@ -50,6 +50,9 @@ files:
50
50
  - bin/break-padding-oracle
51
51
  - bin/break-vigenere-xor
52
52
  - lib/crypto-toolbox.rb
53
+ - lib/crypto-toolbox/analyzers/cbc_mac.rb
54
+ - lib/crypto-toolbox/analyzers/cbc_mac/variable_length/analyzer.rb
55
+ - lib/crypto-toolbox/analyzers/cbc_mac/variable_length/oracles/tcp.rb
53
56
  - lib/crypto-toolbox/analyzers/padding_oracle.rb
54
57
  - lib/crypto-toolbox/analyzers/padding_oracle/analyzer.rb
55
58
  - lib/crypto-toolbox/analyzers/padding_oracle/oracles/http_oracle.rb