距离产生美之大素数的分解运算

距离产生美之大素数的分解运算

目标

已知模数N的值,p,q是一个随机数R附近的质数,且满足下式:
\[| p-q | < 2\sqrt[4]{n}\]
目标:对RSA模数N = pq作因式分解,求出p、q的值

程序要求

  • gcc编译环境
  • gmp大数运算库

代码解析

伪代码为:
\(BEGIN\)
\[A = \lceil{\sqrt{n}}\ \rceil\]
\[X = \sqrt{A^2-N}\]
\[p = A - x\]
\[q = A + x\]
\(END\)

代码实现为:

#include <gmp.h>

int main() {
    /* declare variants */
    mpz_t N, A, p, q, x, one, temp;
    /* init variants */
    mpz_init_set_str(N, "17976931348623159077293051907890"
                        "24733617976978942306572734300811"
                        "57732675805505620686985379449212"
                        "98295958550138753716401571013985"
                        "86478337786069255834975410851965"
                        "91615128057575940752635007475935"
                        "28871082364994994077189561705436"
                        "11494748650467110151015639406805"
                        "27540071584560878577663743040086"
                        "340742855278549092581", 10);
    mpz_init(A);    mpz_init(x);
    mpz_init(p);    mpz_init(q);
    mpz_init_set_si(one, 1);
    mpz_init(temp);
    /* sqrt(N) */
    mpz_sqrt(temp, N);
    /* A = ceil(sqrt(N)) */
    mpz_add(A, temp, one);
    /* A * A */
    mpz_mul(temp, A, A);
    /* A * A - N */
    mpz_sub(temp, temp, N);
    /* x = sqrt(A * A - N) */
    mpz_sqrt(x, temp);
    /* p = A - x */
    mpz_sub(p, A, x);
    /* q = A + x */
    mpz_add(q, A, x);
    /* print p and q */
    gmp_printf("Factor N result is :\n");
    gmp_printf("  p = %Zd\n", p);
    gmp_printf("  q = %Zd\n", q);
    /* exit */
    return 0;
}

简单点来说呢,就是根据右边这个伪代码为流程写的。这个需要计算A= ⌈√N⌉,如果正常的运算,会造成浮点溢出异常。但是,由于声明的类型都是大整数,因此开方后的结果一定会是整数,小数部分会被过滤,再进行+1操作,就是伪代码中的向上取整的操作。剩下的操作,就按照流程运行就是了,最后输出结果。
注意:GMP库声明的变量都需要初始化。(好想知道它是怎么实现的,一定用了泛型编程的思想)

后记

从这次的实验中,应该就是从大整数的角度来看待RSA密钥的复杂性,更准确点来说,由于是大整数,在不知道密钥的情况下,暴力枚举破解这个密钥所需要花费的时间是远远大于使用密钥加密的内容的时效性的,充分说明且体验了RSA密钥的密钥生成和分解的密钥的难度。

传送门:下载

转载于:https://www.cnblogs.com/wsine/p/5620492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值