版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/7296163.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  要生成RSA的密钥,第一步就是要寻找质数,本节专讲如何寻找质数。

  

  我们的质数(又称素数)、合数一般是对正整数来讲,质数就是只有1和本身两个的正整数,合数至少有3个约数,而1既不是合数也不是质数。

  质数有无穷多个,这个早在古希腊时期就被证明了,使用反证法很容易证明:假设质数只有有限多,分别为a1.....an,则a1*a1....*an+1大于所有的质数,却不以任何质数为约数,推出矛盾,从而假设错误。

  

  在质数的分布上,有个定理:

  lim  ∏ (n)/(n/ln(n)) = 1

  n→∞

   其中∏ (n)是小与等于n的质数的个数。

  找质数的第一个门槛还是靠随机,上述公式,可以推导出质数的密度ρ (n)(因为∏ (n)并非连续函数,此处密度只是概率上的密度)为

  lim ρ (n)/(n/ln(n))‘ = 1

  n→∞

 (n/ln(n))' = (ln(n)-1)/ln2(n),

  从而

  

  lim ρ (n)/(1/ln(n)) = 1

   n→∞

  那么,在n附近寻找质数,大约平均每ln(n)次可以找到一个质数。

  涉及到密钥的生成,随机算法要小心了,用时间种子与伪随机算法一起当然是不安全的,最好以硬件随机为基础的随机数,这样无规律,难以从密钥生成机制直接下手破解。

  

  接下来就需要质数判定算法。

  最土的算法:判断p是不是质数,就从2开始,挨个整数判断到p-1,看看是否其中有p的约数,如果没有,就是质数。

  这个算法效率太低O(p),但输入的信息量是p的位数级别,所以此算法应为指数级算法。

  明显提高的算法:如果p是合数,那么必然有一个不为1的约数小于或等于sqrt(p),于是刚才从2挨个整数判断到p-1修整一下,只需要判断到sqrt(p)即可。

  这个算法效率比前面那个算法好太多了,可是依然是指数级算法,只是指数从线性下降到平方根级别。

  可是我们RSA这里的指数动辄几百个bits,甚至两千多个bits,此种算法一样不靠谱。虽然上述算法还可以继续优化,比如测试了一个整数不是p的约数,就尽量不要测试这个整数的整数倍,只是,算法依然很慢。实际上,的确存在多项式级别的确定质数判定算法,第一个这样的算法是AKS算法,2002年由印度人解决。但目前靠谱的算法都是如此的慢,我们需要基于概率的判定方法。

  前两节谈到了模乘群,对于质数p,所有的小于p的正整数在模乘下构成一个群,该群的阶为p-1,则p-1是所有小于p的正整数以p为模的模乘周期的整数倍,这就是著名的费马小定理:

  如果a和p互质,且p为质数,则ap-1%p=1

  费马小定理虽然没有给出一个质数的鉴定方法,但告诉了我们,如果右边等号不成立,则p一定是合数,而基于概率的判定方法一般都会以费马小定理作为基础零件。RSA中一般用Miller-Rabin算法。

  Miller-Rabin算法同时利用了另外一个定义:

  p是质数,x是正整数,x2%p=1,那么x%p=1或者x%p=p-1

  完整描述Miller-Rabin算法如下:(https://en.wikipedia.org/wiki/Miller–Rabin_primality_test) 

write n −  as **r·d with d odd by factoring powers of  from n −
WitnessLoop: repeat k times:
pick a random integer a in the range [, n − ]
x ← ad mod n
if x = or x = n − then
continue WitnessLoop
repeat r − times:
x ← x·x mod n
if x = then
return composite
if x = n − then
continue WitnessLoop
return composite
return probably prime

  里面用到了第二节提到的模幂算法,用bc实现了一遍Miller-Rabin算法,因为bc里面无自带随机函数,就直接利用标准输入来输入随机数了,整个实现如下:

#!/usr/bin/bc -q
define mod_mul(a1,a2,n)
{
return a1*a2%n;
}
define mod_exp(a,b,n)/* a^b%n */
{
while(b%2==0) {
a = mod_mul(a,a,n);
b /= 2;
}
ret = a;
b /= 2;
while(b!=0) {
a = mod_mul(a,a,n);
if(b%2 == 1)
ret = mod_mul(a,ret,n);
b /= 2;
}
return ret;
}
define Miller_Rabin(p, t)
{
if(p==1) {
return 0;
}
if(p<3) {
return 1;
}
if(p%2==0) {
return 0;
} }
define get_rand_num()
{
return read();
} define Miller_Rabin_test(n, k)
{
d = n-1;
r = 0;
while(d%2!=1) {
d /= 2;
r++;
} for(i=0;i<k;i++) {
a = get_rand_num();
x = mod_exp(a,d,n);
if(x==1||x==n-1) {
continue;
}
for(j=1;j<r;j++) {
x = mod_mul(x,x,n);
if(x==1) {
return 0;
} else if(x==n-1) {
j = r;
continue;
}
}
if(j==r) {
return 0;
}
}
return 1;
}

  

 

RSA简介(三)——寻找质数的更多相关文章

  1. RSA算法原理——(2)RSA简介及基础数论知识

    上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...

  2. 加解密 3DES AES RSA 简介 示例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. RSA简介(二)——模幂算法

    RSA最终加密.解密都要用到模乘的幂运算,简称模幂运算. 回忆一下RSA,从明文A到B B=Ae1%N 对B解密,就是 A=Be2%N 其中,一般来说,加密公钥中的e1一般会比较小,取65537居多, ...

  4. 论RSA算法的重要性 -RSA 简介

    地球上最重要的算法 (这个说法似乎有点夸张了,但是当你了解了RSA算法后,就觉得不夸张了.) 如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易.上一篇文章 ssh 协议为什 ...

  5. RSA简介(一)——数论原理

    RSA是最常用的非对称加密算法. 所谓非对称加密,就是说有两个密钥,一个密钥加密只可以用另外一个密钥解密,一般一个作为公钥,公开给所有人用来加密用,而另一个用来解密其他拥有公钥的加密结果,叫做私钥.另 ...

  6. Spring Cloud Config - RSA简介以及使用RSA加密配置文件

    简介 RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的.因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以 ...

  7. RSA简介

    RSA概述 首先看这个加密算法的命名.很有意思,它其实是三个人的名字.早在1977年由麻省理工学院的三位数学家Rivest.Shamir 和 Adleman一起提出了这个加密算法,并且用他们三个人姓氏 ...

  8. 菜鸟脱壳之脱壳的基础知识(三)——寻找OEP

    这节我们来讲讲如何寻找一个程序的OEP,即Original Entry Point.一些PE加壳程序在被加密的程序上面加了一个区段(有的壳也会合并区段),当外壳代码执行完毕以后,会跳到程序的本身的代码 ...

  9. 4、DES和RSA简介

    DES是分组加密算法,速度快,使用单一密钥,加密解密都使用同一个密钥,一般用于大量数据加密,目前处于半淘汰状态. RSA算法是流式加密算法,速度慢,但是使用成对的密钥,加密解密使用不同的密钥,有利于保 ...

随机推荐

  1. 异常:java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.getCellStyleAt

    背景 最近公司所有新项目要使用最新高效快速开发框架nature-framework,框架本身结合NatureMap已经集成excel的高效导入功能,我们要实现高性能的导出功能,因为最新的jxls-2. ...

  2. android studio gradle 两种更新方法更新

    android studio gradle 两种更新方法更新 第一种.Android studio更新 第一步:在你所在项目文件夹下:你项目根目录gradlewrappergradle-wrapper ...

  3. Vijos 1025 小飞侠的游园方案 0-1背包

    描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...

  4. 将notepad++打造成java快速开发IDE

    参考文章:http://blog.csdn.net/mdyyzc/article/details/7653096 有时候要试验一小段代码,打开eclipse又需要忍受漫长的煎熬(电脑配置较低,见谅). ...

  5. EntityManager 实例化方法

    Configure the EntityManager via a persistence.xml file <persistence xmlns="http://java.sun.c ...

  6. Visual Studio自动添加头部注释 -C#开发2010-2013验证

    在团队开发中,头部注释是必不可少的.但在开发每次新建一个类都要复制一个注释模块也很不爽,所以得想个办法让开发工具自动生成我们所需要的模板.....操作方法如下: 找你的vs安装目录, 比如我的是在D盘 ...

  7. asp.net验证码的编写

    很多时候我们在登录什么网站的时候,除了需要什么用户名和密码之外,有的还需要验证码那么在asp.net中这个验证码如何编写和设计,今天我就来给大家说一下: 首先创建一个页面名字随便起一个,我们这里叫做C ...

  8. gulp-rev-append静态资源添加版本号后缀,清理缓存

    大多用的是gulp-rev.gulp-rev-collerctor两个插件,但过程有点麻烦,使用gulp-rev-append插件轻松搞定 github:   https://github.com/b ...

  9. 关于delete使用limit的一些注意事项

    在使用delete删除记录时,如果表里面存在多条相同的记录,但是此刻你只想删除一条记录,那么limit就派上了用场.但是使用limit的时候得注意: 如图,您如果想着删除第一个名字叫做张三的,如果你这 ...

  10. 一步一步学Vue(二)

    接上篇,在本篇中,我们将要实现如下,功能,编辑和查询,我们当前的todolist程序,和线上其它的demo程序不同,我们会对其进行增删改查的基本操作,之后进行进一步的完善,按照常规的系统使用经验,一般 ...