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密钥的密钥生成和分解的密钥的难度。

    传送门:下载

  • 相关阅读:
    idea 使用 maven 下载 jar 包,出现证书校验问题问题
    接口抽象类区别,Java中IO,BIO、NIO、AIO区别以及Files的常用方法
    JIT编译器,Java平台的不同及Java一次编写,随处运行
    什么是Java虚拟机,JVM分配的不同类型内存区域是什么?
    AOP底层原理及AOP操作
    抽象类能使用 final 修饰吗?
    抽象类必须要有抽象方法吗?
    String 类的常用方法都有那些?
    普通类和抽象类有哪些区别?
    如何将字符串反转?
  • 原文地址:https://www.cnblogs.com/wsine/p/5620492.html
Copyright © 2011-2022 走看看