如何优化RSA加密代码以支持e^7及更大指数正常运行
RSA大数运算性能问题解决方案
问题根因
你遇到的性能瓶颈和递归实现的egcd无关:扩展欧几里得的递归深度仅和输入数值的对数成正比,哪怕是1e30量级的数值,递归深度也不会超过100层,完全不会触发栈溢出。
核心性能问题出在两个模块:
- 试除法实现的
is_prime素性检测:当E为e^7+1时数值达到2e22量级,试除法需要遍历到该数的平方根(≈1e11),单次素性检测就要花费数小时,完全不可用 generatenextPrime逻辑冗余:没有跳过偶数,每次查找素数会多做一倍的无效素性检测
优化方案
1. 替换素性检测为米勒-拉宾测试
米勒-拉宾是工业界通用的大数素性检测方案,对于小于2^64的数值,使用固定测试基可以实现100%准确的素性判断,耗时仅需几毫秒:
def is_prime(num): if num <= 1: return False elif num <=3: return True elif num % 2 == 0: return False # 把num-1写成d*2^s的形式 d = num - 1 s = 0 while d % 2 == 0: d //= 2 s += 1 # 适用于<2^64的测试基,100%准确率 test_bases = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37] for a in test_bases: if a >= num: continue x = pow(a, d, num) if x == 1 or x == num -1: continue for _ in range(s-1): x = pow(x, 2, num) if x == num -1: break else: return False return True
2. 优化下一个素数查找逻辑
跳过偶数,减少无效检测:
def generatenextPrime(E): # 如果输入是偶数,先转成奇数 if E % 2 == 0: E += 1 else: E += 2 while True: if is_prime(E): return E E += 2
3. 可选:替换递归egcd为迭代实现(彻底消除递归风险)
def egcd(a, b): old_r, r = a, b old_s, s = 1, 0 old_t, t = 0, 1 while r != 0: quotient = old_r // r old_r, r = r, old_r - quotient * r old_s, s = s, old_s - quotient * s old_t, t = t, old_t - quotient * t return (old_r, old_s, old_t)
效果验证
优化后哪怕E设置为e^15甚至更高量级,都可以在1秒内完成素性检测、密钥生成的全流程,不会出现卡住的问题。
内容的提问来源于stack exchange,提问作者rishabh goyal
相关产品推荐
相关产品推荐

