Class: Analyzers::Utils::KeyCandidateMap
- Inherits:
-
Object
- Object
- Analyzers::Utils::KeyCandidateMap
- Includes:
- Utils::Reporting::Console
- Defined in:
- lib/crypto-toolbox/analyzers/utils/key_candidate_map.rb
Class Method Summary collapse
-
.create(input_buf, keylen) ⇒ Object
factory method for easy use.
Instance Method Summary collapse
-
#initialize ⇒ KeyCandidateMap
constructor
A new instance of KeyCandidateMap.
-
#run(input_buf, keylen) ⇒ Object
Algorithm 1) for each position of the key: (key_byte_pos) 2) create a stream of all the nth bytes of the keylen 3) xor any possible byte value (guess) with all nth’s bytes 4) select those guesses that decipher the nth-byte stream to only english plain ascii chars.
Methods included from Utils::Reporting::Console
Constructor Details
#initialize ⇒ KeyCandidateMap
Returns a new instance of KeyCandidateMap.
14 15 16 |
# File 'lib/crypto-toolbox/analyzers/utils/key_candidate_map.rb', line 14 def initialize @lang_detector = Analyzers::Utils::AsciiLanguageDetector.new end |
Class Method Details
.create(input_buf, keylen) ⇒ Object
factory method for easy use
18 19 20 |
# File 'lib/crypto-toolbox/analyzers/utils/key_candidate_map.rb', line 18 def self.create(input_buf,keylen) new.run(input_buf,keylen) end |
Instance Method Details
#run(input_buf, keylen) ⇒ Object
Algorithm 1) for each position of the key: (key_byte_pos) 2) create a stream of all the nth bytes of the keylen 3) xor any possible byte value (guess) with all nth’s bytes 4) select those guesses that decipher the nth-byte stream to only english plain ascii chars
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/crypto-toolbox/analyzers/utils/key_candidate_map.rb', line 27 def run(input_buf,keylen) #return run2(input_buf,keylen) detector = Analyzers::Utils::HumanLanguageDetector.new candidate_map = (0..(keylen-1)).each_with_object({}) do |key_byte_pos,hsh| =begin # Letter frquency testing freqs = letter_freq(nth_byte_stream.xor_all_with(guess).str) diff = FREQUENCIES.keys - freqs.keys binding.pry if nth_byte_stream.xor_all_with(guess).bytes.all?{|byte| acceptable_char?(byte) } && ((diff.map{|c| FREQUENCIES[c]}.reduce(&:+)||0) > 16) =end # create an array of every nth byte of the input. ( thus a pseudo stream of the nth bytes ) # 1) create an enumerator of the nth positions. e.g for iteration 0: [0,7,14,...] # 2) Next: Map the positions to bytes of the input buffer # # NOTE: regular implementation without cryptbuffer magic: # nth_stream = (key_byte_pos).step(input_buf.bytes.length() -1, keylen).map{|i| input_buf.bytes[i]} # nth_byte_stream2 = CryptBuffer.new(nth_stream) nth_byte_stream = input_buf.nth_bytes(keylen,offset: key_byte_pos) hsh[key_byte_pos] = 0.upto(255).select{|guess| nth_byte_stream.xor_all_with(guess).bytes.all?{|byte| acceptable_char?(byte) } } jot("found #{hsh[key_byte_pos].inspect} bytes for position: #{key_byte_pos}",debug: true) end candidate_map end |