我的Crypter的问题

时间:2016-01-29 02:31:46

标签: python encryption

我尝试使用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。

正如你所看到的那样,直到“信任”这个词一直很顺利。

我不确定我的程序有什么问题。当我在较短的琴弦上测试它时,它产生了所需的效果。是否与标点符号对字符串的影响有关?

1 个答案:

答案 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。

总的来说:你的代码看起来像是编程新手,很酷,继续尝试!但是,密码学和安全性一般都是非常棘手的主题。切勿在现实世界的应用程序中使用此类内容。但为了好玩,这很好!