zoukankan      html  css  js  c++  java
  • 距离产生美之大素数的分解运算

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

    目标

    已知模数N的值,p,q是一个随机数R附近的质数,且满足下式:

    [| p-q | < 2sqrt[4]{n} ]

    目标:对RSA模数N = pq作因式分解,求出p、q的值

    程序要求

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

    代码解析

    伪代码为:
    (BEGIN)

    [A = lceil{sqrt{n}} ceil ]

    [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 :
    ");
    	gmp_printf("  p = %Zd
    ", p);
    	gmp_printf("  q = %Zd
    ", q);
    	/* exit */
    	return 0;
    }
    

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

    后记

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

    传送门:下载

  • 相关阅读:
    ARM的体系结构与编程系列博客——ARM体系版本
    eclipse快捷键
    ARM的体系结构与编程系列博客——ARM的历史与应用范围
    基于LINUX的多功能聊天室
    CC2530自动安全联网
    python3元组
    Python3 列表
    Python3 数字(Number)
    Python3 注释
    python3解释器
  • 原文地址:https://www.cnblogs.com/wsine/p/5620492.html
Copyright © 2011-2022 走看看