使用Python的NumPy实现RSA加密二维数组遇问题求助
解决RSA加密NumPy数组的两个问题
一、解决AttributeError: module 'numpy' has no attribute 'float128'错误
- 原因:
np.float128并非在所有平台/NumPy版本中都可用(比如Windows系统通常不支持该类型),且RSA加密是整数模运算,完全不需要浮点类型,使用浮点类型反而会引入精度问题。 - 解决方案:直接放弃使用浮点类型,改用整数类型进行运算;如果确实需要高精度浮点,可替换为
np.longdouble(跨平台兼容的高精度浮点类型),但这里不推荐,因为整数运算才是正确的选择。
二、修正加密结果与预期不符的问题
问题原因
你当前使用np.power(Bmatrix, 17, dtype=np.float64)再取模,会导致大数精度丢失:float64只能精确表示到253以内的整数,而`Bmatrix`中的元素(比如599)的17次方远大于253,浮点运算无法准确存储这个大数,取模后自然得到错误结果。
正确解决方案
使用Python内置的pow函数的三参数形式pow(base, exponent, modulus),它会高效地计算(base^exponent) % modulus,且全程用整数运算,不会丢失精度。结合NumPy的vectorize函数可以将这个运算向量化,应用到整个数组上。
修正后的代码
import numpy as np # 原始矩阵 Bmatrix = np.array([ [96, 205, 325, 460, 599], [13, 109, 207, 307, 416], [11, 24, 122, 224, 333], [15, 32, 53, 155, 268], [4, 17, 37, 68, 191] ]) # 向量化模幂运算 mod_pow = np.vectorize(lambda x: pow(x, 17, 703)) encrypted_matrix = mod_pow(Bmatrix) print(encrypted_matrix)
输出结果
[[153 394 162 81 534] [535 167 560 545 218] [ 64 612 582 166 629] [698 459 451 127 181] [176 161 37 216 191]]
完全匹配期望输出。
内容的提问来源于stack exchange,提问作者Dr Simhachalam
相关产品推荐
相关产品推荐

