2017-02-21 57 views
0

В основном я следую за программой Encryptor для лаборатории Labs Jumpstart и столкнулся с некоторыми проблемами.Основные проблемы с шифрованием/расшифровкой на основе ротации

Вот мой код

class Encryptor 
    def cipher(rotation) 
    characters = (' '..'z').to_a 
    rotated_characters = characters.rotate(rotation) 
    Hash[characters.zip(rotated_characters)] 
    end 

    def encrypt_letter(letter, rotation) 
    cipher_for_rotation = cipher(rotation) 
    cipher_for_rotation[letter] 
    end 

    def encrypt(string, rotation) 
    letters = string.split("") 

    results = letters.collect do |letter| 
     encrypt_letter = encrypt_letter(letter, rotation) 
    end 

    results.join 
    end 

    def decrypt_letter(letter, rotation) 
    cipher_for_rotation = cipher(rotation) 
    reversed_cipher = cipher_for_rotation.to_a.reverse.to_h 
    reversed_cipher[letter] 
    end 

    def decrypt(string, rotation) 
    letters = string.split("") 

    results = letters.collect do |letter| 
     decrypt_letter = decrypt_letter(letter, rotation) 
    end 

    results.join 
    end 
end 

Я бег в трудность с моим методом расшифровки. Вот следующие вставленные из IRB

2.3.0 :001 > load './encryptor.rb' 
=> true 
2.3.0 :002 > e = Encryptor.new 
=> #<Encryptor:0x007fe93a0319b8> 
2.3.0 :003 > encrypted = e.encrypt("Hello, World!", 10) 
=> "Rovvy6*ay!vn+" 
2.3.0 :004 > e.decrypt(encrypted, 10) 
=> "\\y%%(@4k(+%x5" 

Как вы можете видеть, когда дешифрование моей зашифрованной строки следует выводить «Hello, World!», Что я зашифрован его с вращением 10. Не посмотрите, что я делаю неправильно здесь, любая помощь будет оценена по достоинству.

+0

Это, безусловно, проблема с моей функции decrypt_letter. Проверьте следующее после некоторой отладки в IRB: e.encrypt_letter ('т', 13) => "и" > e.decrypt_letter ('&', 13) => "3" –

+0

Есть лучший метод, чем мой метод .to_a.reverse.to_h? –

+0

Я признаю, что я не смотрел глубоко на ваш код, но тот факт, что ваши методы расшифровки и шифрования выглядят по-другому, - это красный флаг для меня. (Фактически, факт, что у вас даже есть два метода вообще, является подозрительным.) Из чего я могу понять ваш код, вы реализуете Цезарский шифр, а Цезарский шифр полностью симметричен: шифрование и дешифрование - это точно одно и то же, просто с разными ключами. Не должно быть двух методов, и * конечно * не должно быть двух разных * методов для шифрования и дешифрования, поскольку оба они точно такие же. –

ответ

0

Вы можете просто взглянуть на ключ хэша.

def decrypt_letter(letter, rotation) 
    cipher_for_rotation = cipher(rotation) 
    cipher_for_rotation.key(letter) 
end 

Пример:

irb(main):003:0> e = Encryptor.new 
=> #<Encryptor:0x007fbcea9b65c8> 
irb(main):004:0> enc = e.encrypt "Hello, World!", 10 
=> "Rovvy6*ay!vn+" 
irb(main):005:0> e.decrypt enc, 10 
=> "Hello, World!" 
+0

Это может быть именно то, что я искал, спасибо за ввод. Да, это прекрасно работает. огромное спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^