RSA大质数生成 - Python3.8
基于 Python3.8
舍友的作业要手撕 RSA,虽然我 RSA 一点都不会但是生成1024位的素数还是挺好玩的。就简单实现了一下
其实就是暴力枚举,生成一个1024位的整数,然后判断是否为素数,不是的话就加一,如此往复...
素数的密度大致与 \(\ln n\) 成反比,也就是说,随机一个 n bit 的正整数,如果不是素数,则往后取 n 个数字,大概率会碰到一个素数
判断是否位素数可以用 MillerRabin,然后利用 Python 的高精度写起来会很舒服
最后生成100个1024位的素数用时 132.7102403s。平均每个 1.3 秒,可以接受
################################
# Withinlover
# 2020.11.2
# 大质数生成
################################
from random import randint
import time
def miller_rabin(p):
if p == 1: return False
if p == 2: return True
if p % 2 == 0: return False
m, k, = p - 1, 0
while m % 2 == 0:
m, k = m // 2, k + 1
a = randint(2, p - 1)
x = pow(a, m, p)
if x == 1 or x == p - 1: return True
while k > 1:
x = pow(x, 2, p)
if x == 1: return False
if x == p - 1: return True
k = k - 1
return False
def is_prime(p, r = 40):
for i in range(r):
if miller_rabin(p) == False:
return False
return True
if __name__ == '__main__':
T = time.perf_counter()
for _ in range(100):
index = 1024
print(index, "位质数: ", end="")
num = 0
for i in range(index):
num = num * 2 + randint(0, 1)
while is_prime(num) == False:
num = num + 1
print(num)
print("----------------------------")
print("用时:", time.perf_counter() - T)