我正在编写一个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'
我想弄清楚的是我应该如何阻止这种情况发生,因为它只是第一个发生这种情况的角色。
注意:我不想/知道如何安装任何其他模块(即加密),因为这主要是在我的学校计算机上开发的。
答案 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
成为9999
(e
)等。因此 - 你自己有Caesar cipher。< / p>
您的解密函数在相反的方向上几乎完全相同,第一个字符将始终以相同的方式构造,其余字符将ascii右移相同的位置到原始位置。
如果您需要加密,请帮自己一个忙,并使用适当的加密。这是一个simple example。