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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM