CryptoHack_MATHEMATICS_PRIMES

 绕过素数检测:https://eprint.iacr.org/2018/749.pdf

github找到脚本

https://github.com/loluwot/StrongPseudoPrimeGeneratorMkII/blob/main/sol.py

from Crypto.Util.number import *
import itertools
from tqdm import tqdm

def generate_basis(n):
    basis = [True] * n
    for i in range(3, int(n**0.5)+1, 2):
        if basis[i]:
            basis[i*i::2*i] = [False]*((n-i*i-1)//(2*i)+1)
    return [2] + [i for i in range(3, n, 2) if basis[i]]


def miller_rabin(n, b):
    """
    Miller Rabin test testing over all
    prime basis < b
    """
    basis = generate_basis(b)
    if n == 2 or n == 3:
        return True

    if n % 2 == 0:
        return False

    r, s = 0, n - 1
    while s % 2 == 0:
        r += 1
        s //= 2
    for b in basis:
        x = pow(b, s, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True



def xgcd(a, b):
    s = 0
    t = 1
    r = b
    s1 = 1
    t1 = 0
    r1 = a
    while not (r == 0):
        q = r1//r
        r1, r = r, r1-q*r
        s1, s = s, s1-q*s
        t1, t = t, t1-q*t
        #print(r1, s1, t1)
    return (r1, s1, t1)

def crt1(residues, modulos):
    #print(modulos)
    rm = list(zip(residues, modulos))
    cur_res, cur_mod = rm[0]
    for r, m in rm[1:]:
        
        g = GCD(cur_mod, m)
        
        if not r % g == cur_res % g:
            return -1, -1
        r1, s, t = xgcd(m//g, cur_mod//g)
       # print(r, cur_res, r % g, cur_res%g, s, t)
        cur_res = cur_res * m//g * s + r * cur_mod//g * t
        cur_mod *= m//g
        cur_res %= cur_mod
    return cur_res, cur_mod

primes = generate_basis(64)
print(len(primes))
fool = []
h = 3
def legendre(a, p):
    # if a == 2:
        # return (-1)**((p**2-1)//8)
    return pow(a, (p-1)//2, p)

for p in primes:
    f = set()
    for i in generate_basis(200*p)[1:]:
        #print(legendre(p, i))
        if legendre(p, i) == i-1:
            f.add(i % (4*p))
            
    fool.append(list(f))
    
print(primes)
#print(fool)
ks = [1, 998244353, 233]   
fool2 = []
for p, f in enumerate(fool):
    prime = primes[p]
    m = prime*4
    cur_set = set(f)
    for i in range (1, h):
        new_set = set()
        for ff in f:
            if ((ff + ks[i] - 1)*inverse(ks[i], m)) % 4 == 3:
                new_set.add(((ff + ks[i] - 1)*inverse(ks[i], m)) % m)
        cur_set = cur_set.intersection(new_set)
    fool2.append(cur_set)
print(fool2)
mm = 1
for a in fool2:
    mm *= len(a)

print(mm)
pr = 0
for tup in itertools.product(*fool2):
    residues = []
    modulos = []
    #modul = 1
    for i, t in enumerate(tup):
        residues.append(t)
        modulos.append(primes[i]*4)
        # g = GCD(primes[i]*4, modul)
        # modul *= (primes[i]*4)//g
    residues.append(ks[1]-inverse(ks[2], ks[1]))
    modulos.append(ks[1])
    residues.append(ks[2]-inverse(ks[1], ks[2]))    
    modulos.append(ks[2])
    #print(modulos)

    sol, modul = crt1(residues, modulos)
    #rint(sol)
    #print(modul)
    #print(sol)
    found = False
    if not sol == -1:
        cur_t = sol
        #print(sol % modul)
        cur_t = 2**73*modul + cur_t
        for i in tqdm(range(100000)):
            if isPrime(cur_t):
                fin = cur_t
                facs = [cur_t]
                for ii in range(1, h):
                    facs.append(ks[ii]*(cur_t-1) + 1)
                    fin *= ks[ii]*(cur_t-1) + 1
                #print(fin.bit_length())
                if(miller_rabin(fin, 64)):
                    print(isPrime(fin))
                    print(fin)
                    print(facs)
                    if fin.bit_length() >= 600 and fin.bit_length() <= 900:
                        found = True
                        break
            cur_t += modul

    if found:
        break

跑出素数和base提交。

### 回答1: 《离散数学及其应用》是一本写给大学生学习离散数学的教材,由肯尼思·罗森(Kenneth Rosen)编写的第七版。这本教材广泛被全球大学使用,被认为是离散数学的经典教材之一。 该书的主要内容包括逻辑、集合论、证明技巧、算法、图论、组合学、递归等等。它的目标是帮助学生培养解决离散数学问题的能力,并应用到计算机科学、信息科学等领域。 《离散数学及其应用》的第七版相对于之前的版本进行了更新和改进。这本书的特点是深入浅出、结构清晰,并通过大量的例题和习题来帮助读者理解和巩固所学的知识。此外,该书还提供了很多实际应用的案例,以帮助读者将理论知识应用到实际问题中。 这本教材的编写风格简单明了,循序渐进,适合初学者学习。它不仅介绍了基础概念和技术,还包含了一些前沿的研究成果,使读者能够了解到离散数学的最新进展。 总的来说, 《离散数学及其应用》是一本优秀且经典的教材,对于学习离散数学的学生和从事相关领域的研究者来说都是一本不可多得的学习和参考资料。无论是想深入了解离散数学理论知识,还是应用到实际问题中,这本书都将是一个非常有价值的工具。 ### 回答2: 《离散数学及其应用(第7版)》是一本经典的数学教材,由肯尼斯·罗森(Kenneth Rosen)编写。该书广泛应用于计算机科学、信息技术和工程等领域的离散数学课程。 该教材主要包括了离散数学的核心概念和方法,如集合论、命题逻辑、谓词逻辑、证明技巧、图论、组合数学、概率论等内容。每一章节都有大量的例子和习题,帮助读者理解和掌握相关概念和技巧。 与其他教材相比,这本书的特点之一是强调数学的应用。例如,在图论部分,书中介绍了图的应用于计算机网络、社交网络和电路设计等方面,并提供了相关的算法和技巧。此外,该书还涵盖了离散数学在密码学、信息安全和计算机算法等领域的应用。 另一个特点是该教材的详细性和全面性。编者在选材上做了周到的考虑,以确保教材尽可能地覆盖离散数学的各个方面。此外,书中内容的组织结构合理,逻辑严谨,帮助读者更好地理解和掌握知识。 总之,《离散数学及其应用(第7版)》是一本经典的离散数学教材,适用于计算机科学、信息技术和工程领域的学生和从业人员。通过学习这本教材,读者可以系统地理解离散数学的基本概念和方法,并能够应用于实际问题的求解。 ### 回答3: 《离散数学及其应用 第7版》是美国著名数学家Kenneth H. Rosen所著的一本教材,广泛应用于离散数学的学习和教学。这本教材被广泛认为是离散数学领域的经典教材之一,内容丰富全面,涵盖了离散数学的各个方面。 该书分为7个部分,分别是基础概念、结构和函数、归纳和递归、计数和概率、图论、树和算法、布尔代数和自动机。每个部分都由多个章节组成,侧重于讲解相应领域的核心概念和基本原理。该书的语言简单明了,循序渐进,既适合作为初学者的入门书,也适合作为高级学习者的参考书。 《离散数学及其应用 第7版》的特点之一是其丰富的例题和习题。每个章节都提供了大量的例题来帮助读者理解概念和应用,而且每章末尾还有大量的习题供读者练习。这些例题和习题的设计非常精细,既涵盖了基本知识点的掌握,也拓展了读者的思维和解题能力。此外,书中还提供了答案和解析供读者参考。 总体而言,Kenneth H. Rosen的《离散数学及其应用 第7版》是一本非常优秀的教材,对于学习离散数学的人来说是一个不可多得的宝库。不仅能够帮助读者建立坚实的数学基础,提高解决问题的能力,也能够培养读者的逻辑思维和分析能力。无论是学生、教师还是专业人士,都能从中获得巨大的收益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值