crypto-toolbox 0.0.12 → 0.0.13

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: ee58381316f414e6b610b2c7419ea17568d1c8ab
4
- data.tar.gz: 9c1da9c5e6560e1e9716e1c0da61ee48104be1bc
3
+ metadata.gz: 403cf818e558bf451d876c20fbbb90cdff55a573
4
+ data.tar.gz: cd70a45a5d69397d691bd08a7eb5069affdbba1e
5
5
  SHA512:
6
- metadata.gz: 9c9a123f43746790ad871b68eec3c1e94ab0665eb2844de9ac56449ea31338b9f75cf3e2a35aeb0f9e6eaede4a4f0031a44c5065eea06de64a4bc16455d1b852
7
- data.tar.gz: 95d71af46fb8147b7eb2173fb9048d09fc94a4d0bcd9b99e8fa34b0d44ac4b7595bcb155ab0e2b1ef7f074a2c0c90d4aa9d57fe6d5a7e34c4303d084eea96045
6
+ metadata.gz: 823cc7f89d4e7913affde18355b49b7a63415885c43a413f462e22b91c31b42f48f7ca9459f735a581a12dd9a41405ad8807f5d9ec61a82c9d8b3c38643b8c6b
7
+ data.tar.gz: 168e3ae351b6e89a006b956ca49e7ba02c431875f383880e7729db3582261606659261239ff5be724cf438e9c31f438359c9848fd186fb4451884d057926534d
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'crypto-toolbox'
4
+
5
+ if $0 == __FILE__
6
+ input = ARGV[0] || "0xF96DE8C227A259C87EE1DA2AED57C93FE5DA36ED4EC87EF2C63AAE5B9A7EFFD673BE4ACF7BE8923CAB1ECE7AF2DA3DA44FCF7AE29235A24C963FF0DF3CA3599A70E5DA36BF1ECE77F8DC34BE129A6CF4D126BF5B9A7CFEDF3EB850D37CF0C63AA2509A76FF9227A55B9A6FE3D720A850D97AB1DD35ED5FCE6BF0D138A84CC931B1F121B44ECE70F6C032BD56C33FF9D320ED5CDF7AFF9226BE5BDE3FF7DD21ED56CF71F5C036A94D963FF8D473A351CE3FE5DA3CB84DDB71F5C17FED51DC3FE8D732BF4D963FF3C727ED4AC87EF5DB27A451D47EFD9230BF47CA6BFEC12ABE4ADF72E29224A84CDF3FF5D720A459D47AF59232A35A9A7AE7D33FB85FCE7AF5923AA31EDB3FF7D33ABF52C33FF0D673A551D93FFCD33DA35BC831B1F43CBF1EDF67F0DF23A15B963FE5DA36ED68D378F4DC36BF5B9A7AFFD121B44ECE76FEDC73BE5DD27AFCD773BA5FC93FE5DA3CB859D26BB1C63CED5CDF3FE2D730B84CDF3FF7DD21ED5ADF7CF0D636BE1EDB79E5D721ED57CE3FE6D320ED57D469F4DC27A85A963FF3C727ED49DF3FFFDD24ED55D470E69E73AC50DE3FE5DA3ABE1EDF67F4C030A44DDF3FF5D73EA250C96BE3D327A84D963FE5DA32B91ED36BB1D132A31ED87AB1D021A255DF71B1C436BF479A7AF0C13AA14794"
7
+ analyzer = Analyzers::VigenereXor.new.analyze(input)
8
+ end
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
@@ -1,7 +1,4 @@
1
1
 
2
- #require 'shellwords'
3
- require 'ffi/hunspell'
4
-
5
2
  =begin
6
3
  # References:
7
4
  #
@@ -12,18 +9,20 @@ require 'ffi/hunspell'
12
9
  module Analyzers
13
10
  class VigenereXor
14
11
  def jot(message, debug: false)
15
- if ENV["SEMI_AUTO_ANALYSIS"]
16
- if debug == false || ENV["DEBUG_ANALYSIS"]
17
- puts message
18
- end
12
+ if debug == false || ENV["DEBUG_ANALYSIS"]
13
+ puts message
19
14
  end
20
15
  end
21
16
  def print_delimiter_line
22
17
  puts "====================================================================="
23
18
  end
24
-
19
+ def acceptable_char?(byte)
20
+ (byte > 31 && byte < 123) && (byte != 60 && byte !=64)
21
+ end
22
+
25
23
  def find_pattern(buf)
26
- bitstring = buf.bits.map{|b| b[0]}.join("")
24
+ bitstring = buf.nth_bits(0).join("")
25
+
27
26
  1.upto([buf.bytes.length,62].min).map do |ksize|
28
27
  parts = bitstring.scan(/.{#{ksize}}/)
29
28
  if parts.uniq.length == 1
@@ -35,9 +34,6 @@ module Analyzers
35
34
  end
36
35
 
37
36
  def analyze(input)
38
- require "crypto-toolbox"
39
- require "byebug"
40
-
41
37
  buf = CryptBuffer.new(input)
42
38
  result = find_pattern(buf)
43
39
 
@@ -58,7 +54,7 @@ module Analyzers
58
54
 
59
55
  candidate_map[key_byte]=[]
60
56
  1.upto(255).each do |possible_key_value|
61
- if smart_buf.xor_all_with(possible_key_value).bytes.all?{|e| e > 31 && e < 123 && e != 60 && e !=64}
57
+ if smart_buf.xor_all_with(possible_key_value).bytes.all?{|byte| acceptable_byte?(byte) }
62
58
  jot("YES: " + smart_buf.xor_all_with(possible_key_value).to_s,debug: true)
63
59
  candidate_map[key_byte] << possible_key_value
64
60
  else
@@ -81,20 +77,22 @@ module Analyzers
81
77
  if ENV["SEMI_AUTO_ANALYSIS"] && ENV["DEBUG_ANALYSIS"]
82
78
  print_candidate_encryptions(candidate_map,keylen,buf)
83
79
  end
80
+
81
+ results = KeySearch::Filter::AsciiPlain.new(combinations,buf).filter
82
+ report_result(results,buf)
83
+ end
84
84
 
85
- result = KeySearch::Filter::AsciiPlain.new(combinations,buf).filter
86
- unless result.empty?
85
+ def report_result(results,buf)
86
+ unless results.empty?
87
87
  jot "[Success] Found valid result(s)"
88
- result.each do |r|
88
+ results.each do |r|
89
89
  print_delimiter_line
90
90
  jot r.xor(buf).str
91
91
  print_delimiter_line
92
92
  end
93
93
  end
94
-
95
-
96
94
  end
97
-
95
+
98
96
  def print_candidate_encryptions(candidate_map,keylen,buf)
99
97
  # printout for debugging. (Manual analysis of the characters)
100
98
  print "======= Decryption result of first #{keylen} bytes with all candidate keys =======\n"
@@ -2,6 +2,9 @@ require 'aes'
2
2
  require 'openssl'
3
3
 
4
4
  class CryptBuffer
5
+ class OutOfRangeError < RuntimeError; end
6
+
7
+
5
8
  attr_accessor :bytes
6
9
 
7
10
  include Enumerable
@@ -31,6 +34,15 @@ class CryptBuffer
31
34
  end
32
35
  alias_method :s, :str
33
36
 
37
+
38
+ # Returns an array of the nth least sigificant by bit of each byte
39
+ def nth_bits(n)
40
+ raise OutOfRangeError if n < 0
41
+ raise OutOfRangeError if n > 7
42
+
43
+ bits.map{|b| b.reverse[n].to_i }
44
+ end
45
+
34
46
  def bits
35
47
  map{|b| "%08d" % b.to_s(2) }
36
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crypto-toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis Sivia
@@ -41,10 +41,12 @@ dependencies:
41
41
  description: |2
42
42
  Easily work with primitives like arrays of Bytes or hextrings, to make learning und testing cryptographic methods work like a charme.
43
43
  email: dev@d-coded.de
44
- executables: []
44
+ executables:
45
+ - break-vigenere-xor
45
46
  extensions: []
46
47
  extra_rdoc_files: []
47
48
  files:
49
+ - bin/break-vigenere-xor
48
50
  - lib/crypto-toolbox.rb
49
51
  - lib/crypto-toolbox/analyzers/vigenere_xor.rb
50
52
  - lib/crypto-toolbox/ciphers/caesar.rb