我的水晶有问题吗

2024-06-26 13:23:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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 . 你好,鲍勃,我是特鲁特,我是杜鲁威。

正如你所见,在“信任”这个词出现之前,一切都很顺利

我不确定我的程序出了什么问题。当我在较短的弦上测试时,它产生了预期的效果。这和标点符号对字符串的影响有关吗?你知道吗


Tags: key字符串ininputstringprintletcrypt
1条回答
网友
1楼 · 发布于 2024-06-26 13:23:51

我看到的第一个问题是:

letkeypos = cryptlist[0][crypted_str.index(let)]

部分crypted_str.index(let)不会返回实际字母的位置,而是返回字符串crypted_str中同一字母的第一个出现位置。因此,您将访问错误的键元素。你知道吗

要在知道元素索引的同时遍历字符串,可以使用以下方法:

for idx,val in enumerate("abcdef"):
    print idx
    print val

另外,不应该对可读字符串进行加密,而应该在二进制级别进行加密。还要看看模运算符如何帮助您使用 字母表。你知道吗


总而言之:你的代码看起来像是编程新手,这很酷,继续尝试吧!然而,密码学和安全性通常是非常棘手的话题。不要在现实世界的应用程序中使用这样的东西。但为了好玩,没关系!你知道吗

相关问题 更多 >