我尝试使用python制作一个基本的密码器,它使用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))
但是,当我用相同的密钥加密然后解密某个东西时,它就变得不连贯了。两者的字母表是相同的,印地语是用来阻止索引错误的占位符。你知道吗
让我们来看看这个:
加密还是解密?
加密
请输入要加密的字符串。 只有字母和数字。使用下划线而不是空格。
你好,鲍勃。我相信你做得很好。
*您的字符串:&6Wxyटzd.ञCडUk?yBण65;.pi?ज73xAW?ZC0ग3wLlठ 加密密钥:[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、18]
我把这个复制到记事本里,然后重新打开文件。你知道吗
加密还是解密?
解密
输入字符串。
&6Wxyटzd.ञCडUk?yBण65;.pi?ज73xAW?*ZC0ग3wLlठ
钥匙呢?
[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、18]
小时 15 电子 14 我 21 我 7 o 19 _ 23 B类 5 o 18 b类 16 . 26 我 21 _ 4 t型 22 右 24 u型 7 o 9 t型 23 _ 15 电子 25 o 27 u型 18 b类 15 一 7 右 24 u型 16 _ 22 d级 23 o 21 我 三 不 14 我 24 u型 25 五 9 电子 26 我 23 是的 11 _ 23 o 6 电子 12 我 0 我 18 . 你好,鲍勃,我是特鲁特,我是杜鲁威。
正如你所见,在“信任”这个词出现之前,一切都很顺利
我不确定我的程序出了什么问题。当我在较短的弦上测试时,它产生了预期的效果。这和标点符号对字符串的影响有关吗?你知道吗
我看到的第一个问题是:
部分
crypted_str.index(let)
不会返回实际字母的位置,而是返回字符串crypted_str
中同一字母的第一个出现位置。因此,您将访问错误的键元素。你知道吗要在知道元素索引的同时遍历字符串,可以使用以下方法:
另外,不应该对可读字符串进行加密,而应该在二进制级别进行加密。还要看看模运算符如何帮助您使用 字母表。你知道吗
总而言之:你的代码看起来像是编程新手,这很酷,继续尝试吧!然而,密码学和安全性通常是非常棘手的话题。不要在现实世界的应用程序中使用这样的东西。但为了好玩,没关系!你知道吗
相关问题 更多 >
编程相关推荐