【发布时间】:2021-01-06 12:39:08
【问题描述】:
我试图在加密后将大量数字输入 numpy 数组,但它说数字太长并且溢出。我检查了代码,在将数字输入numpy数组之前一切都正确,但是在输入数据的步骤中出现错误,即en1[i,j] = pk.raw_encrypt(int(test1[i,j]))。
我在这里得到的加密号码是3721469428823308171852407981126958588051758293498563443424608937516905060542577505841168884360804470051297912859925781484960893520445514263696476240974988078627213135445788309778740044751099235295077596597798031854813054409733391824335666742083102231195956761512905043582400348924162387787806382637700241133312260811836700206345239790866810211695141313302624830782897304864254886141901824509845380817669866861095878436032979919703752065248359420455460486031882792946889235009894799954640035281227429200579186478109721444874188901886905515155160376705016979283166216642522595345955323818983998023048631350302980936674。 Python3 仍然声称它是一个 int 类型。数字本身没有溢出,但是numpy数组不允许填充。
numpy 的什么属性导致了这个问题,有没有解决这个问题的方法?我考虑过使用 list 来替换 numpy 数组,但是当它不是一维数组时,它会很难实现。我在下面附上了完整的测试代码。
test1 = np.array([[1,2,3],[1,2,4]])
test2 = np.array([[4,1,3],[6,1,5]])
en1 = np.copy(test1)
en2 = np.copy(test2)
pk, sk = paillier.generate_paillier_keypair()
en_sum = np.copy(en1)
pl_sum = np.copy(en1)
for i in range(test1.shape[0]):
for j in range(test2.shape[1]):
en1[i,j] = pk.raw_encrypt(int(test1[i,j]))
en2[i,j] = pk.raw_encrypt(int(test2[i,j]))
en_sum[i,j] = en1[i,j]*en2[i,j]
pl_sum[i,j] = sk.raw_decrypt(en_sum[i,j])
sum = sk.raw_decrypt(en_sum)
【问题讨论】:
-
Python 支持任意长度整数的算术运算。但是
numpy是为速度而写的,它的整数是 C 长整数,限制为 32 位,表示范围为 -2,147,483,647 到 +2,147,483,647 的值。您可以尝试将其转换为字符串以使numpy受益。
标签: python numpy overflow paillier