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)
posted @ 2020-11-02 13:36  Withinlover  阅读(3223)  评论(1编辑  收藏  举报