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