class Gemnigma::Crack
Public Class Methods
new()
click to toggle source
# File lib/Gemnigma/crack.rb, line 7 def initialize @messages = Messages.new end
Public Instance Methods
get_cmd_args()
click to toggle source
# File lib/Gemnigma/crack.rb, line 11 def get_cmd_args if ARGV.length < 4 @messages.few_args return end if ARGV.length == 4 @input_file = ARGV[1] @output_file = ARGV[2] @date_gen = ARGV[3] validate { brute_force_key_map(@input_file, @date_gen) } end if ARGV.length > 4 @messages.too_much_args return end end
Private Instance Methods
brute_crack(word)
click to toggle source
# File lib/Gemnigma/crack.rb, line 115 def brute_crack(word) mapping = map_word_to_crack(word) mapping.map! do |arr| CipherDecrypt.rotate_backward(arr.last)[arr.first] end mapping.join end
brute_force_key_map(input, date)
click to toggle source
# File lib/Gemnigma/crack.rb, line 36 def brute_force_key_map(input, date) unless true_date?(date) @messages.wrong_date(date) return end encrypted_file = File.open(input, "r") index_count = 0 crack_key = 0 end_char_arr = [] @key_map = [] encrypted_file.read.split("").each do |item| index_count = 0 if index_count > 3 end_char_arr << [item, index_count] index_count += 1 end end_chars = end_char_arr[-7..-4] while crack_key <= 99 if CipherDecrypt.rotate_backward(crack_key)[end_chars[0][0]] == "." @key_map[end_chars[0][1]] = crack_key crack_key = 0 break end crack_key += 1 end while crack_key <= 99 if CipherDecrypt.rotate_backward(crack_key)[end_chars[1][0]] == "." @key_map[end_chars[1][1]] = crack_key crack_key = 0 break end crack_key += 1 end while crack_key <= 99 if CipherDecrypt.rotate_backward(crack_key)[end_chars[2][0]] == "e" @key_map[end_chars[2][1]] = crack_key crack_key = 0 break end crack_key += 1 end while crack_key <= 99 if CipherDecrypt.rotate_backward(crack_key)[end_chars[3][0]] == "n" @key_map[end_chars[3][1]] = crack_key crack_key = 0 break end crack_key += 1 end if @key_map.length == 4 crack_file(@input_file, @output_file) end encrypted_file.close end
crack_file(input, output)
click to toggle source
# File lib/Gemnigma/crack.rb, line 190 def crack_file(input, output) encrypted_file = File.open(input, "r+") cracked_file = File.open(output, "w+") input_content = encrypted_file.read cracked_file.write(brute_crack(input_content)) encrypted_file.close cracked_file.close generate_cracked_key end
generate_cracked_key()
click to toggle source
# File lib/Gemnigma/crack.rb, line 172 def generate_cracked_key @cracked_key = 0 date_offset = Offset.new.offset key_arr = @key_map.zip(date_offset).map {|arr| arr.inject(&:-)} possible_key_combination = [key_gen(key_arr[0], key_arr[1]), key_gen(key_arr[2], key_arr[3])].flatten possible_key_combination.map! do |number| if number == possible_key_combination.last number else number.to_s[0].to_i end end @cracked_key = possible_key_combination.join @messages.success_message(@output_file, @secret_key, @date_gen) end
key_gen(init, next_item)
click to toggle source
# File lib/Gemnigma/crack.rb, line 133 def key_gen(init, next_item) new_arr = [] if pad_key(init)[1] != pad_key(next_item)[0] if pad_key(init + 39)[1] == next_item.to_s[0] new_arr << (init + 39) new_arr << next_item elsif pad_key(init + 78)[1] == next_item.to_s[0] new_arr << (init + 78) new_arr << next_item elsif pad_key(init + 39)[1] == (next_item + 39).to_s[0] new_arr << (init + 39) new_arr << (next_item + 39) elsif pad_key(init + 39)[1] == (next_item + 78).to_s[0] new_arr << (init + 39) new_arr << (next_item + 78) elsif pad_key(init + 78)[1] == (next_item + 39).to_s[0] new_arr << (init + 78) new_arr << (next_item + 39) elsif pad_key(init + 78)[1] == (next_item + 78).to_s[0] new_arr << (init + 78) new_arr << (next_item + 78) elsif pad_key(init)[1] == (next_item + 39).to_s[0] new_arr << init new_arr << (next_item + 39) elsif pad_key(init)[1] == (next_item + 78).to_s[0] new_arr << init new_arr << (next_item + 78) end end if pad_key(init)[1] == pad_key(next_item)[0] new_arr << init new_arr << next_item end new_arr end
map_word_to_crack(word)
click to toggle source
# File lib/Gemnigma/crack.rb, line 101 def map_word_to_crack(word) result = [] count_key = 0 word.downcase.split("").each_with_index do |letter, index| if count_key >= @key_map.length count_key = 0 end result << [letter, @key_map[count_key]] count_key += 1 end result end
pad_key(key)
click to toggle source
# File lib/Gemnigma/crack.rb, line 125 def pad_key(key) if key.to_s.length == 1 key = "0" + key.to_s else key = key.to_s end end
true_date?(date)
click to toggle source
# File lib/Gemnigma/crack.rb, line 32 def true_date?(date) (date.to_i ** 2).to_s.chars.last(4).map(&:to_i) == Offset.new.offset end