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

    传送门:下载

  • 相关阅读:
    HBase 高性能加入数据
    Please do not register multiple Pages in undefined.js 小程序报错的几种解决方案
    小程序跳转时传多个参数及获取
    vue项目 调用百度地图 BMap is not defined
    vue生命周期小笔记
    解决小程序背景图片在真机上不能查看的问题
    vue项目 菜单侧边栏随着右侧内容盒子的高度实时变化
    vue项目 一行js代码搞定点击图片放大缩小
    微信小程序进行地图导航使用地图功能
    小程序报错Do not have xx handler in current page的解决方法
  • 原文地址:https://www.cnblogs.com/wsine/p/5620492.html
Copyright © 2011-2022 走看看