Я делаю простой шифр-шифр/дешифратор vigenere в python, и он работает по большей части. Я не получаю никаких ошибок, но некоторые буквы не зашифрованы или дешифрованы (или и то?) Должным образом. Вот мой код:Vigenere cipher развращает некоторые
import sys
if not len(sys.argv) == 4:
print "Not enough arguments."
print "Usage: python vigener.py <encrypt/decrypt> 'ciphertext' 'key'"
sys.exit()
mode = sys.argv[1]
ctext = sys.argv[2]
key = sys.argv[3]
if mode == "encrypt":
print "Encrypting using vigener cipher..."
elif mode == "decrypt":
print "Decrypting using vigener cipher..."
else:
print "Unknown function '"+str(mode)+"'."
print "Usage: python vigener.py <encrypt/decrypt> 'ciphertext' 'key'"
MAGIC_NUMBER = 96
ctext = ctext.lower()
repeated_key = (key * (1+len(ctext)/len(key)))[:len(ctext)]
if mode == "encrypt":
ctext = ctext.replace(" ", "{")
nums = [ord(ltr)-MAGIC_NUMBER for ltr in ctext]
rk_nums = [ord(ltr)-MAGIC_NUMBER for ltr in repeated_key]
enc_nums = [(num+rk_nums[ nums.index(num) ]) % 27 for num in nums]
enc_ltrs = [chr(num+MAGIC_NUMBER) for num in enc_nums]
print "".join(enc_ltrs)
elif mode == "decrypt":
enc_nums = [ord(ltr)-MAGIC_NUMBER for ltr in ctext]
rk_nums = [ord(ltr)-MAGIC_NUMBER for ltr in repeated_key]
dec_nums = [(num-rk_nums[ enc_nums.index(num) ]) for num in enc_nums]
dec_nums2 = [ (num + 27 if num < 1 else num) for num in dec_nums]
dec_ltrs = [chr(num+MAGIC_NUMBER) for num in dec_nums2]
dec_str = "".join(dec_ltrs)
dec_str = dec_str.replace("{", " ")
print "".join(dec_str)
и вот мой терминальный вывод:
$ python vigener.py encrypt 'this is confidential' 'secretkey'
Encrypting using vigener cipher...
lmljeljeagsiliyslltq
$ python vigener.py decrypt 'lmljeljeagsiliyslltq' 'secretkey'
Decrypting using vigener cipher...
thts ts conftfenttal
$
кажется, только зашифровать/расшифровать некоторые буквы неправильно. Что, черт возьми, происходит?
Большое вам спасибо, я попробую! Я на 90% уверен, что это сработает - я скажу вам, если это не так. Я бы проголосовал за этот ответ, но у меня недостаточно репутации. –
О, это странно, если я проверю ваш ответ, тогда мне разрешено также голосовать за него (что я только что сделал). –
Yup, вам нужно 15 репутации, чтобы перевернуть вещи. [Страница привилегий] (http://stackoverflow.com/help/privileges) – Nayuki