Masalah Enkripsi/Dekripsi Berbasis Rotasi Dasar

Pada dasarnya saya mengikuti program Encryptor tantangan laboratorium Jumpstart, dan mengalami beberapa masalah.

Ini kode saya

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

Saya mengalami kesulitan dengan metode dekripsi saya. Berikut ini yang ditempelkan dari 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"

Seperti yang Anda lihat, saat mendekripsi string terenkripsi saya, seharusnya menghasilkan "Halo, Dunia!", yang saya gunakan untuk mengenkripsinya, dengan rotasi 10. Jangan lihat kesalahan apa yang saya lakukan di sini, bantuan apa pun akan sangat kami hargai .


person Sam Lim    schedule 21.02.2017    source sumber
comment
Ini pasti ada masalah dengan fungsi decrypt_letter saya. Periksa yang berikut ini setelah beberapa proses debug di irb: e.encrypt_letter('t',13) =› & › e.decrypt_letter('&',13) =› 3   -  person Sam Lim    schedule 21.02.2017
comment
Apakah ada metode yang lebih baik daripada metode '.to_a.reverse.to_h' saya?   -  person Sam Lim    schedule 21.02.2017
comment
Saya akui saya belum melihat secara mendalam kode Anda, tetapi fakta bahwa metode dekripsi dan enkripsi Anda terlihat berbeda merupakan tanda bahaya bagi saya. (Sebenarnya, fakta bahwa Anda memiliki dua metode sama sekali mencurigakan.) Dari apa yang saya pahami tentang kode Anda, Anda menerapkan Caesar Cipher, dan Caesar Cipher sepenuhnya simetris: mengenkripsi dan mendekripsi adalah hal yang persis sama, hanya dengan kunci yang berbeda. Tidak boleh ada dua metode, dan tentu saja tidak boleh ada dua metode yang berbeda untuk enkripsi dan dekripsi, karena keduanya sama persis.   -  person Jörg W Mittag    schedule 21.02.2017
comment
@JörgWMittag terima kasih banyak atas tanggapannya, saya baru memahami dasar-dasar Ruby di sini. Saya mengikuti tutorial ini: tutorials.jumpstartlab.com/projects/encryptor.html yang menurut saya mengarahkan saya dalam menerapkan metode seperti yang Anda sebutkan tetapi menunjukkan cara yang salah untuk melakukannya terlebih dahulu? Tidak yakin. Pasti akan memperhatikan saran Anda dan melakukan penelitian lebih lanjut.   -  person Sam Lim    schedule 21.02.2017
comment
Pada dasarnya, decrypt(10) sama dengan encrypt(-10), yang pada gilirannya sama dengan encrypt(17) (dengan asumsi alfabet 27 huruf). Secara umum, decrypt(N) == encrypt(-N) == encrypt(alphabet.size - N).   -  person Jörg W Mittag    schedule 21.02.2017
comment
Hal lain yang saya perhatikan: cipher_for_rotation.to_a.reverse.to_h. Anda mengubah kamus menjadi sebuah array, membalikkan array (yaitu membalikkan urutan kamus), dan kemudian mengubahnya menjadi kamus lagi. Namun urutan tidak menjadi masalah untuk kamus, jadi Anda akan mendapatkan kamus yang sama dengan yang Anda gunakan untuk memulai. Lebih tepatnya: Ruby Hashes do mempertahankan urutan penyisipan kunci, dan dijamin akan melakukan iterasi dalam urutan tersebut, jadi apa yang telah Anda lakukan adalah membalikkan urutan penyisipan (dan dengan demikian membalikkan urutan iterasi). Namun Anda tidak pernah mengulangi hash, Anda hanya mengakses nilainya.   -  person Jörg W Mittag    schedule 21.02.2017
comment
Jadi pada dasarnya ini adalah NO-OP.   -  person Jörg W Mittag    schedule 21.02.2017


Jawaban (1)


Anda bisa mencari kunci hashnya.

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

Contoh:

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!"
person rohit89    schedule 21.02.2017
comment
Ini mungkin yang saya cari, terima kasih atas masukannya. Ya, ini berfungsi dengan sempurna. terima kasih banyak - person Sam Lim; 21.02.2017