class OpenEnigma::Enigma

Public Class Methods

new(plain_text, rand_num, plug_hash) click to toggle source
# File lib/open_enigma.rb, line 12
def initialize(plain_text, rand_num, plug_hash)
  @plain_text = plain_text
  @rand_num = rand_num
  @plug_hash = plug_hash
end

Public Instance Methods

run() click to toggle source
# File lib/open_enigma.rb, line 18
def run
  alphabet = ('a'..'z').to_a
  alphabet_1 = alphabet.shuffle(random: Random.new(@rand_num))
  alphabet_2 = alphabet.shuffle(random: Random.new(@rand_num + 1))
  alphabet_3 = alphabet.shuffle(random: Random.new(@rand_num + 2))
  scrambler_1 = alphabet.zip(alphabet_1).to_h
  scrambler_2 = alphabet.zip(alphabet_2).to_h
  scrambler_3 = alphabet.zip(alphabet_3).to_h
  reflector_alphabet_1 = ('a'..'m').to_a.shuffle(random: Random.new(@rand_num))
  reflector_alphabet_2 = ('n'..'z').to_a.shuffle(random: Random.new(@rand_num))
  reflector = reflector_alphabet_1.zip(reflector_alphabet_2).to_h
  
  count = 0
  cryptogram = ''
  text_array = @plain_text.chars
  text_array.each do |char|
    result = plug_board(char, @plug_hash)
    result = scrambler(scrambler_1, result)
    result = scrambler(scrambler_2, result)
    result = scrambler(scrambler_3, result)
    result = reflector(reflector, result)
    result = scrambler(scrambler_3.invert, result)
    result = scrambler(scrambler_2.invert, result)
    result = scrambler(scrambler_1.invert, result)
    result = plug_board(result, @plug_hash)
    cryptogram += result
    if count % 676 == 0 && count >= 676
      # scrambler_2, scrambler_1を1回転
      scrambler_2_array =  scrambler_2.values.unshift(scrambler_2.values.last)
      scrambler_2_array.pop
      scrambler_2 = alphabet.zip(scrambler_2_array).to_h
      scrambler_1_array =  scrambler_1.values.unshift(scrambler_1.values.last)
      scrambler_1_array.pop
      scrambler_1 = alphabet.zip(scrambler_1_array).to_h
    elsif count % 26 == 0 && count >= 26
      # scrambler_2を1回転
      scrambler_2_array =  scrambler_2.values.unshift(scrambler_2.values.last)
      scrambler_2_array.pop
      scrambler_2 = alphabet.zip(scrambler_2_array).to_h
    end
    # scrambler_3を1回転
    scrambler_3_array =  scrambler_3.values.unshift(scrambler_3.values.last)
    scrambler_3_array.pop
    scrambler_3 = alphabet.zip(scrambler_3_array).to_h
    count += 1
  end
  cryptogram
end

Private Instance Methods

plug_board(char, hash) click to toggle source
# File lib/open_enigma.rb, line 69
def plug_board(char, hash)
  result = ''
  hash.each do |key, value|
    if char == key
      result = value
      break
    elsif char == value
      result = key
      break
    else
      result = char
    end
  end
  result
end
reflector(reflector_hash, char) click to toggle source
# File lib/open_enigma.rb, line 89
def reflector(reflector_hash, char)
  if reflector_hash[char].nil?
    reflector_hash.invert[char]
  else
    reflector_hash[char]
  end
end
scrambler(scrambler_hash, char) click to toggle source
# File lib/open_enigma.rb, line 85
def scrambler(scrambler_hash, char)
  scrambler_hash[char]
end