Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中浮点到int的转换(Hill密码)_Python_Cryptography - Fatal编程技术网

Python中浮点到int的转换(Hill密码)

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[

在我的希尔密码代码(解密期间)中将浮点转换为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[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 size
int
值。但是如果你不需要,它只会让事情变得更慢、更复杂。)

大概你有一个刚好低于574.0的平面值,因此,如果你在上面调用
round
,你会得到
574
——但是你调用的是
int
,它会截断,所以你会得到
573
。别那么做,谢谢你的回复。它使用
round()
函数工作。感谢您的回答@abarnert。这是有道理的,我应该首先使用
dtype=int
。谢谢
[260, 573, 538]