2017-02-21 5 views
0

기본적으로 나는 Jumpstart의 랩퍼의 도전 인 Encryptor 프로그램을 따르고 있으며 몇 가지 문제가 있습니다.기본 회전 기반 암호화/암호 해독 문제

여기 내 해독의 방법으로 어려움을 실행 해요 내 코드

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" 

에서 붙여 넣기 다음은 "안녕하세요, 세계!"나는 10하지 마십시오의 회전과 함께, 그것을 암호화 무엇 내가 여기서 잘못하고있는 것을 보아라, 어떤 도움이라도 인정 될 것이다.

+0

그것은 확실히 내 decrypt_letter 기능에 문제가 있습니다. 다음은 몇 가지의 IRB 디버깅 후에 다음 확인 ('&', 13) => e.encrypt_letter ('t', 13) => "&" > e.decrypt_letter "3" –

+0

거기인가 내 '.to_a.reverse.to_h'방법보다 나은 방법? –

+0

나는 당신의 코드를 자세히 보아본 적이 없다는 것을 인정하지만, 해독 방법과 암호화 방법이 다르게 보인다는 사실은 나를위한 적기 다. (실제로 두 가지 방법을 사용하는 경우조차도 의심 스럽습니다.) 코드에서 이해할 수있는 것부터 Caesar Cipher를 구현하고 Caesar Cipher는 완전히 대칭입니다. 암호화 및 암호 해독은 정확히 똑같습니다. 다른 키들로. 두 가지 방법을 사용할 수 없습니다. 암호화와 암호 해독에 두 가지 다른 방법이 없어야합니다. 두 가지 방법이 완전히 동일하기 때문입니다. –

답변

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

정확하게 입력 했으므로 찾고 있던 내용 일 수 있습니다. 예, 완벽하게 작동합니다. 무리 감사 –