我尝试使用python创建一个基本的crypter,使用One-time pad密码创建一个难以理解的消息 (是的,我知道,randint实际上并不是随机的,而且它是安全的废话。)
from random import randint
from time import sleep
choose = input("Encrypt or Decrypt?")
if choose == 'encrypt':
alphabet = "afqtEVnUGAYIBMTpXsrjlgFJNicSPOKoLDWzdCyukxeRmvbhwHQZ1234567890_?.,;:!&*कखगघङचछजझञटठडढणतथदधनपफबभमक़"
crypt_string = ""
crypted_string = []
crypt_con = False
enc_key = []
while crypt_con == False:
print('Please enter a string to be encrypted.')
crypt_string_in = input('letters and numbers only. Use underscore instead of space.')
crypt_string = crypt_string_in
crypt_con = True
print ("Crypting...")
sleep(3)
for let in crypt_string:
key = randint(0,27)
letpos = alphabet.index(let)
letter = alphabet[letpos + key]
crypted_string.append(letter)
enc_key.append(key)
print ("Your string:" + ''.join(crypted_string))
print ("The encryption key:" + ''.join(str(enc_key)))
input ('Press ENTER to exit.')
elif choose == 'decrypt':
alphabet = "afqtEVnUGAYIBMTpXsrjlgFJNicSPOKoLDWzdCyukxeRmvbhwHQZ1234567890_?.,;:!&*कखगघङचछजझञटठडढणतथदधनपफबभमक़"
print ('Input the string.')
crypted_str = input('')
print ('And the key?')
cryptlist = []
cryptkey_in = input('')
cryptkey = eval(cryptkey_in)
cryptlist.append(cryptkey)
print (cryptlist)
decrypted_str = []
for let in crypted_str:
letpos = alphabet.index(let)
letkeypos = cryptlist[0][crypted_str.index(let)]
print (letkeypos)
correctlet = alphabet[letpos - letkeypos]
print (correctlet)
decrypted_str.append(correctlet)
print ("".join(decrypted_str))
然而,当我使用相同的密钥加密然后解密某些内容时,它变得不连贯。两者的字母表相同,而印地语是占位符,可以阻止索引错误。
让我们来看看:
加密还是解密?
加密
请输入要加密的字符串。 只限字母和数字。使用下划线而不是空格。
Hello_Bob.I_trust_you_are_doing_very_well。
*你的字符串:& 6Wxyटzd。ञCडUk?yBण65;。pi?ज73 xAW? ZC0ग3 wLlठ 加密密钥:[20,15,14,21,7,19,23,5,18,16,26,21,4,22,24,21,9,23,19,25,27,2,15 ,7,21,16,22,23,16,3,13,1,25,9,19,23,11,6,6,12,0,11]
我将其复制到记事本中并重新打开文件。
加密还是解密?
解密
输入字符串。
&安培; 6WxyटZDञÇड屋YBण65 ;. PIज73 XAW * ZC0ग3 WLLठ
。????关键?
[20,15,14,21,7,19,23,5,18,16,26,21,4,22,24,21,9,23,19,25,27,2 ,15,7,21,16,22,23,16,3,13,1,25,9,19,23,11,6,6,12,0,11]
ħ 15 Ë 14 升 21 升 7 Ø 19 _ 23 乙 五 Ø 18 b 16 。 26 一世 21 _ 4 Ť 22 [R 24 ü 7 Ø 9 Ť 23 _ 15 Ë 25 Ø 27 ü 18 b 15 一个 7 [R 24 ü 16 _ 22 d 23 Ø 21 升 3 ñ 14 升 24 ü 25 v 9 Ë 26 一世 23 ÿ 11 _ 23 Ø 6 Ë 12 升 0 升 18 。 Hello_Bob.I_truot_eoubaru_dolnluveIy_oell。
正如你所看到的那样,直到“信任”这个词一直很顺利。
我不确定我的程序有什么问题。当我在较短的琴弦上测试它时,它产生了所需的效果。是否与标点符号对字符串的影响有关?
答案 0 :(得分:0)
我看到的第一个问题是:
letkeypos = cryptlist[0][crypted_str.index(let)]
部分crypted_str.index(let)
不会返回您的实际字母的位置,而是字符串crypted_str
中第一次出现相同字母的位置。因此,您将访问错误的关键元素。
要在知道元素索引的同时迭代字符串,您可以使用:
for idx,val in enumerate("abcdef"):
print idx
print val
此外,您不应对可读字符串进行加密,而应使用二进制级别。还要看看模运算符如何帮助您使用 字母表workaraound。
总的来说:你的代码看起来像是编程新手,很酷,继续尝试!但是,密码学和安全性一般都是非常棘手的主题。切勿在现实世界的应用程序中使用此类内容。但为了好玩,这很好!