Python中浮点到int的转换(Hill密码)
在我的希尔密码代码(解密期间)中将浮点转换为int得到了不同的结果 代码: 问题: 代码:Python中浮点到int的转换(Hill密码),python,cryptography,Python,Cryptography,在我的希尔密码代码(解密期间)中将浮点转换为int得到了不同的结果 代码: 问题: 代码: # create empty plain text string plain_text = "" # result is a matrix [[260. 574. 439.]] # addition of 65 because inputs are uppercase letters for i in range(dimensions): plain_text += chr(int(result[
# create empty plain text string
plain_text = ""
# result is a matrix [[260. 574. 439.]]
# addition of 65 because inputs are uppercase letters
for i in range(dimensions):
plain_text += chr(int(result[0][i]) % 26 + 65)
输出:ABS
(密码文本-加密文本-为POH)
结果矩阵:(逆矩阵与密钥矩阵相乘后)
转换为int后:
[260, 573, 538]
有人能解释一下为什么会发生这种情况,并给出解决办法吗?谢谢。问题是您正在使用,它会向零截断 带有
浮点值的数学本质上是不精确的。如果你不明白为什么,经典的解释是。但简短的版本是,每次转换和每次中间计算都会四舍五入到与实际数字最接近的52位分数。这可能意味着,如果用实数进行计算,将得到精确的574,而当用float
s进行计算时,实际上会得到一个略大于或小于574的数字。如果最后得到一个比574小一点点的数字,并用int
将其截断为零,则得到573
在本例中,您要做的是使用取而代之的方法,即舍入到最接近的整数。只要你能确定你的累计误差永远不会达到0.5,那就可以满足你的要求。而且,只要您不选择大得离谱的键值(这是毫无意义的,因为这样您就不会获得更多的安全性),您就可以确信这一点
然而,这里有两件事值得考虑
通过对维基百科上文章的简要浏览:它设计为使用快速铅笔和纸张操作。首先,你不需要逆矩阵,只需要一个逆mod 26的矩阵,它更容易计算,这意味着你停留在更小的数字中,不太可能有这个问题。这意味着你可以用整数做所有的数学运算,所以问题一开始就不会出现:用dtype=int
创建一个数组,这样就不会有取整问题了。而且,作为奖励,如果你选择了非常大的键值,你会得到一个错误而不是错误的结果。(如果你想允许这样的值,你会想在dtype=object
数组中存储Python unlimited sizeint
值。但是如果你不需要,它只会让事情变得更慢、更复杂。)大概你有一个刚好低于574.0的平面值,因此,如果你在上面调用round
,你会得到574
——但是你调用的是int
,它会截断,所以你会得到573
。别那么做,谢谢你的回复。它使用round()
函数工作。感谢您的回答@abarnert。这是有道理的,我应该首先使用dtype=int
。谢谢
[260, 573, 538]