RSA算法

RSA是(Rivest Shamir and Adleman)的缩写,Ron Rivest, AdiShamir 和Leonard Adleman这仨哥们挺NB的,20多年前创造了这个算法,现在也已经广泛使用了。

这是一种公钥的加密算法,加密和解密是互逆的。如果用公钥加密,私钥解密,可实现保密通信;如果用私钥加密,公钥解密,可实现数字签名。下面说一下算法:

1、首先选择两个大素数p和q

都要大于10^100,因为小素数很容分解

2、令n=p*q和z=(p-1)*(q-1)

这部没什么可解释的

3、选择d,要求d与z互质。

只要是互质数都行

4、选择e,要求e*d=1 (mod z)

一说这个mod就烦人了,这里的mod的意思是数学符号,并非编程的mod,好比a=b (mod c),意思是a和b除以c后,余数相同。

5、明文P被分为k位的块,k要满足2^k<n的最大整数,于是0<=p<n。

这不没什么可说的。

下面是加密和解密过程,先说公钥加密,私钥解密的过程:

1、公钥加密用到e,n这两个数。C=P^e (mod n)

C是加密后的密文,P是明文,e和n就是算出来的数字了,但是这里的mod是电脑编程里的运算符,意思是取余数。

解密用到d,n,P=C^d (mod n)

这样明文P就出来了。

2、私钥用到d,n这两个数。C=P^d (mod n)

解密用到e,n这两个数。P=C^e (mod n)

可以代两个简单的2位素数来试试,不过你会发现,p和q很容易就被推算出来了,所以为什么说要大素数的原因就在这里。因为安全性是基于大素数分解的困难性,如果攻击者要分解200位的数,需要40亿年;500位的数,需要10^25年。这就是为什么RSA的重大缺陷是无法从理论上把握它的保密性能如何。

时间: 2024-10-17 12:44:41

RSA算法的相关文章

springmvc使用RSA算法加密表单

今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统.这样做无非就是直接通过登录页没法直接输入用户名密码,但用个程序模拟登陆也不是什么太难的事情.以前一直写那么多,一直没有注意,直到今天被吐槽,才发现以前自己的做法是多么的幼稚. 加密数据的方式当然不止一种,也可以通过https加密数据,但是对于一般应用来说,还需要花钱拿去给那些认证机构签

RSA算法(一)

转载:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 作者: 阮一峰 日期: 2013年6月27日 如果你问我,哪一种算法最重要? 我可能会回答"公钥加密算法". 因为它是计算机通信安全的基石,保证了加密数据不会被破解.你可以想象一下,信用卡交易被破解的后果. 进入正题之前,我先简单介绍一下,什么是"公钥加密算法". 一.一点历史 1976年以前,所有的加密方法都是同一种模式: (

RSA算法(二)

转载:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解RSA算法.假设爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢? 第一步,随机选择两个不相等的质数p和q. 爱丽丝选择了61和53.(实际应用中,这两个质数越

RSA算法Java的简单实现

RSA简介 RSA算法据说是目前地球上最重要的加密算法.维基百科是这么介绍的:"对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠.假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降.但找到这样的算法的可能性是非常小的.今天只有短的RSA密钥才可能被暴力破解.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的." 看上去很神奇是吧,其实在学习网络

程序员眼中的RSA算法

RSA算法是数学应用于实际的一项伟大发明,起数学过程相对而言还是比较专业的,有兴趣可以看看. RSA算法的证明过程,详见:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 首先默认有个欧拉定理及相关的推论成立,这个要看证明过程不简单 然后看一下其加密解密的公式,可以试着推导一下: 可以看出非对称的加密解密过程,在数学上是成立的. 那么回头看它的安全性:就是要确保d不被攻破,d安全的前提是n不被成功分解. 1.能不

RSA算法初学

RSA的算法涉及三个参数,n.e1.e2. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质:再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1. (n,e1),(n,e2)就是密钥对.其中(n,e1)为公钥,(n,e2)为私钥.[1] RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n:B=A^e1 mod n:(公钥加密体制中,一般用

这个发现是否会是RSA算法的BUG、或者可能存在的破解方式?

笔者从事各种数据加解密算法相关的工作若干年,今天要说的是基于大数分解难题的RSA算法,可能有些啰嗦. 事情的起因是这样的,我最近针对一款芯片进行RSA CRT解密的性能优化.因为期望值是1024bits长度能做到20ms左右,但我的实现结果接近40ms.为了找到更加快速的实现方式,我在各大论坛查找不基于Jebelean和Montgomery的模乘实现.在查找过程中非常偶然的获得了一组密钥数据,现在按照一般生成密钥的顺序,先对该组数据简单说明一下,证明其正确性. 1. 密钥产生过程 选取两个512

重复造轮子之RSA算法(一) 大素数生成

出于无聊, 打算从头实现一遍RSA算法 第一步, 大素数生成 Java的BigInteger里, 有个现成的方法 public static BigInteger probablePrime(int bitLength, Random rnd) { bitLength是期望生成的素数的二进制位数, rnd是随机数发生器 函数注释表明, 这个方法的返回值为合数的概率为2^-100 生成100个1024位的素数, 耗时13471ms 但是显然我不打算直接使用这个函数, 要做就从最底层做起! 目前的做

RSA算法详解

1.RSA加密算法是最常用的非对称加密算法 2.RSARSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名, 3.目前学术界无法证明RSA算法的绝对正确性,但是也无法证明否定它的安全性,因此恰恰说明该算法有相当的可信性. 4.RSA原理基于大数分解的难度,其公钥和私钥是一对大素数对的函数,从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题) 5.具体的加密,解密,流程 RSA的公钥.私钥的组成,以及加密.

跨越千年的RSA算法

跨越千年的RSA算法 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里是一万字能扯完的?在写作的过程中,我查了很多资料,找到了很多漂亮的例子,也积累了很多个人的思考