Python 3.4 Encrypter和Decrypter无法正常工作

时间:2017-06-10 19:02:19

标签: python encryption

我正在编写一个python程序来加密和解密自定义字符串。这不会用于任何严肃的事情,它只是为了好玩。加密器似乎工作正常,但在这里,加密器。程序将所有内容写入文件。如下面的代码所示,如​​果密钥(由用户定义)将其置于127以上,程序将循环使用ASCII字符。

我的问题是,在解密时,我会收到一些奇怪的字符。使用密钥超过229时失败。

加密器:

temp_key = 9999
message = "Hello"
result = ""
for char in message:
    ecry_char_int = ord(char) - temp_key
    while ecry_char_int < 0:
                temp_key -= 128
                ecry_char_int = 128 - temp_key
    result += chr(ecry_char_int)
print(result)

Decrypter的:

result2 = ""
encoded = result
ekey = 9999
for char in encoded:
    decr_char_int = ord(char) + ekey
    while decr_char_int > 127:
         ekey -= 128
         decr_char_int = ekey
    result2 += chr(decr_char_int)
print(result2)

例如,使用密钥"Hello"加密9999;我得到加密的"qV]]`"字符串。使用键"qV]]`"解密字符串9999我得到了这个:

'\x0fello'

我想弄清楚的是我应该如何阻止这种情况发生,因为它只是第一个发生这种情况的角色。

注意:我不想/知道如何安装任何其他模块(即加密),因为这主要是在我的学校计算机上开发的。

1 个答案:

答案 0 :(得分:0)

那是因为你没有真正加密任何东西 - 在你的算法变成一个简单的凯撒密码的第一个字符之后,第一个字符将永远被'加密'作为所有条件128 - temp_key % 128的值temp_key > ord(first_char) {1}}。

问题在于,在初始ecry_char_int = ord(char) - temp_key之后,如果碰巧小于关键字,那么你就不会考虑当前的角色(而ord('H')的情况就是{{1}当你的密钥为72时 - 你进入一个循环,你从9999连续减去128,同时将temp_key设为128 - temp_key。最终,ecry_char_int会小到足以在从temp_key中减去时生成正数,此时您将该数字设置为“加密”字符。所以,你基本上采用了一种长而循环的方式将第一个字符设置为128的值(128 - temp_key % 128,顺便说一句。这就是为什么函数中的第一个字符始终是{{1几乎所有键113)。

但这还不是全部 - 因为您现在已经将q的值修改为原始>256(因此temp_key密钥为temp_key % 128)所有后续字符将被ascii左移这个数量,导致15成为9999e)等。因此 - 你自己有Caesar cipher。< / p>

您的解密函数在相反的方向上几乎完全相同,第一个字符将始终以相同的方式构造,其余字符将ascii右移相同的位置到原始位置。

如果您需要加密,请帮自己一个忙,并使用适当的加密。这是一个simple example