Class: Enygma::Cracker

Inherits:
Object
  • Object
show all
Defined in:
lib/enygma/cracker.rb

Constant Summary collapse

PLAIN_LAST_7_CHARACTERS =
"..end.."

Instance Method Summary collapse

Constructor Details

#initialize(cypher_filename, encryption_date, plain_filename = nil) ⇒ Cracker

Returns a new instance of Cracker.



11
12
13
14
15
16
17
# File 'lib/enygma/cracker.rb', line 11

def initialize(cypher_filename, encryption_date, plain_filename = nil)
  @cypher_filename = cypher_filename
  @plain_filename = plain_filename
  @encryption_date = encryption_date
  @offset = Offset.get_offset(@encryption_date)
  @decrypted = ""
end

Instance Method Details

#crackObject



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/enygma/cracker.rb', line 19

def crack
  cypher_characters = Filer.read(@cypher_filename)
  cypher_last_4_characters = cypher_characters.last(4)
  cypher_last_4_characters.rotate!(4 - (cypher_characters.size % 4))
  plain_last_4_characters = PLAIN_LAST_7_CHARACTERS.split("").last(4)
  plain_last_4_characters.rotate!(4 - (cypher_characters.size % 4))
  offset_characters = @offset.split("")
  differences = get_differences(
    cypher_last_4_characters,
    plain_last_4_characters,
    offset_characters
  )

  key = KeyGen.get_key(differences)
  Decryptor.new(@cypher_filename, key, @encryption_date, @plain_filename).
    decrypt
end

#get_differences(cypher_array, plain_array, offset_array) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/enygma/cracker.rb', line 37

def get_differences(cypher_array, plain_array, offset_array)
  differences = []
  4.times do |i|
    diff = Enygma::CHARACTER_MAP.index(cypher_array[i]) -
      Enygma::CHARACTER_MAP.index(plain_array[i])

    diff -= offset_array[i].to_i
    differences[i] = diff.to_s.rjust(2, '0')
  end

  differences
end