如何使用python代码获得非常大的素数

2024-04-19 01:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个程序来查找RSA密钥中使用的两个大素数。这只是一个ctf挑战。我现在面临的问题是,这个数字是以10的幂表示的,我不想这样。我希望结果是完整的数字形式(不是10的幂,但可以是十进制)。你知道吗

我已经尝试过python的十进制库,但是我不知道为什么它会导致错误的答案。当删除十进制库及其函数时,它显示的是正确的结果。然而,即使在结果期间,十进制库也不能证明答案是完整的。你知道吗

代码:

 import math

    n = 456378902858290907415273676326459758501863587455889046415299414290812776158851091008643992243505529957417209835882169153356466939122622249355759661863573516345589069208441886191855002128064647429111920432377907516007825359999


    s=str(math.sqrt(n))
    print (s)
    s=math.ceil(s)
    print(s)

    k=(s*s)-n

    print(k)
    k=math.ceil(k)
    j=math.sqrt(k)
    print(j)

    p= (s-j)
    q= (s+j)
    print("p = " , p)
    print("q = " , q)

    i = p*q

    l = n-i
    print(l)

在这里,结果是l的0,但我需要的p和q是一个巨大的数字,(2.136302629426752e+112)是10的幂形式。你知道吗


Tags: 函数答案程序证明错误密钥数字math
1条回答
网友
1楼 · 发布于 2024-04-19 01:23:01

祝你保理业务好运。它是一个复合材料,没有很小的因素,也不是费马琐碎。但这不是重点。你知道吗

安装gmpy2(例如pip安装gmpy2)。你知道吗

现在你可以这样写:

from gmpy2 import mpz, isqrt, is_square
n = mpz('19297732862995346424713322001009')
a = isqrt(n)
while True:
  a += 1
  b2 = a*a - n
  if is_square(b2):
    break
print(n,"=",a-isqrt(b2),"*",a+isqrt(b2))

它以104位输入为例,应用费马的方法,很快就找到了一个因子。理论上,我们应该先加一个素数检验,这样如果给定素数,我们就不会永远旋转。你知道吗

相关问题 更多 >