阮一峰的网络日志
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
rsa的加密和数字认证怎么结合起来,能不能具体说明一下。
还有公钥和私钥到底哪个才是用来加密和哪个用来解密?
15 个回答
在回答之前我看了一下已经有的答案,我个人感觉不太舒服… 首先,题主既然提出了问题,我们还是应该用心来答,而不是打击题主的信心… 其次,题主有这个问题的本质原因是因为RSA体制本身的一个特点决定的。我相信题主在提问前已经进行了很多的资料搜索和查找工作,甚至有可能阅读了RSA那篇原始论文。因此,我们应该更多地考虑:
- 为什么题主会提出这个问题,这个问题的本质原因来自于哪里?
- 我们如何进行详细的解答,帮助题主解决这个问题。
最后,一些答案本身可能会误导大家,所以还请仔细斟酌后再进行回答。
=================分割线=================
我们来回顾一下RSA的加密算法。我们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法。
RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。
- 。密钥生成算法以安全常数作为输入,输出一个公钥PK,和一个私钥SK。安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关。越大,质数p一般越大,保证体制有更高的安全性。在RSA中,密钥生成算法如下:算法首先随机产生两个不同大质数p和q,计算N=pq。随后,算法计算欧拉函数。接下来,算法随机选择一个小于的整数e,并计算e关于的模反元素d。最后,公钥为PK=(N, e),私钥为SK=(N, d)。
- 。加密算法以公钥PK和待加密的消息M作为输入,输出密文CT。在RSA中,加密算法如下:算法直接输出密文为
- 。解密算法以私钥SK和密文CT作为输入,输出消息M。在RSA中,解密算法如下:算法直接输出明文为。由于e和d在下互逆,因此我们有:
所以,从算法描述中我们也可以看出:公钥用于对数据进行加密,私钥用于对数据进行解密。当然了,这个也可以很直观的理解:公钥就是公开的密钥,其公开了大家才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才能够解密密文。否则大家都能看到私钥,就都能解密,那不就乱套了。
=================分割线=================
我们再来回顾一下RSA签名体制。签名体制同样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。
- 。密钥生成算法同样以安全常数作为输入,输出一个公钥PK和一个私钥SK。在RSA签名中,密钥生成算法与加密算法完全相同。
- 。签名算法以私钥SK和待签名的消息M作为输入,输出签名。在RSA签名中,签名算法直接输出签名为。注意,签名算法和RSA加密体制中的解密算法非常像。
- 。验证算法以公钥PK,签名以及消息M作为输入,输出一个比特值b。b=1意味着验证通过。b=0意味着验证不通过。在RSA签名中,验证算法首先计算,随后对比M'与M,如果相等,则输出b=1,否则输出b=0。注意:验证算法和RSA加密体制中的加密算法非常像。
所以,在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解:对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行,大家看到签名都能通过验证证明确实是我自己签的。
=================分割线=================
那么,为什么题主问这么一个问题呢?我们可以看到,RSA的加密/验证,解密/签字过程太像了。同时,RSA体制本身就是对称的:如果我们反过来把e看成私钥,d看成公钥,这个体制也能很好的执行。我想正是由于这个原因,题主在学习RSA体制的时候才会出现这种混乱。那么解决方法是什么呢?建议题主可以学习一下其他的公钥加密体制以及签名体制。其他的体制是没有这种对称性质的。举例来说,公钥加密体制的话可以看一看ElGamal加密,以及更安全的Cramer-Shoup加密。签名体制的话可以进一步看看ElGamal签名,甚至是BLS签名,这些体制可能能够帮助题主更好的弄清加密和签名之间的区别和潜在的联系。
至于题主问的加密和签名是怎么结合的。这种体制叫做签密方案(SignCrypt),RSA中,这种签密方案看起来特别特别像,很容易引起混乱。在此我不太想详细介绍RSA中的加密与签字结合的方案。我想提醒题主的是,加密与签字结合时,两套公私钥是不同的。
如果题主还有进一步的问题,欢迎留言。我个人是衷心希望大家都了解一点密码学的知识,以便了解庞大的计算机网络系统到底是如何保护数据安全性的。希望我的回答能对题主有所帮助。
以上
- 小明想秘密给小英发送消息
- 小英手里有一个盒子(public key),这个盒子只有小英手里的钥匙(private key)才打得开
- 小英把盒子送给小明(分发公钥)
- 小明写好消息放进盒子里,锁上盒子(公钥加密)
- 小明把盒子寄给小英(密文传输)
- 小英用手里的钥匙打开盒子,得到小明的消息(私钥解密)
- 假设小刚劫持了盒子,因为没有小英的钥匙,他也打不开
这个视频解释得很好
https://www.youtube.com/watch?v=wXB-V_Keiu8
关于公钥加密系统的原理在另一个帖子中我觉得我回答的已经够详细的了。 非对称加密的设计原理是什么? - 钱宸的回答
关于数字签名。首先得先了解数字签名的作用是什么。在密码学的三大主要性质中一般的RSA加密保证的是"confidentiality"而数字签名则保证的是"integrity"和“Authenticity”。
假设Alice的公钥和密钥分别是(PKa, SKa)而Bob的公钥和密钥分别是(PKb,SKb)。并且两人共享一个“散列函数”(Hash function) H。 另外在下面过程中定义加密函数为Enc(),解密函数为Dec(),具体的函数类型定义,以及定义域和值域,可以从后面过程中看出,我就不完整的定义了。
如果Alice要向Bob发送信息m的话。首先先用RSA加密m得到(Enc(m,PKb))。但是Bob收到以后并不能知道这个信息是Alice发送的并且在传输途中没有被更改。
1. 如果Alice想要证明信息是她发送的那么,通常的做法就是证明她拥有Alice的密钥。(除非Alice自己作死,否则密钥是永远不公开并且只有自己知道的)。
2.Alice就制作一个数字签名S= Enc(H(m),SKa)。(注其中的H为共享的Hash function,作用是为了向Bob证明数据在传输的过程中没有被更改)。因为H是共享的所以Bob也能算出H(m),Bob所要做的就是Dec(S,PKa) = Hm'。 然后比较H(m)和Hm‘,两者相等则签名被认证,反之签名未被认证。
证明的大概思想:
Authenticity : 如果签名被认证那么也就是说首先发签名的人必须用Alice的密钥SKa操作过这个信息所以,发签名的人有Alice的密钥 => 发签名的人就是Alice。
integrity : 如果信息在传输途中被篡改,那么HashFunction的值也会改变(当然如果更改的值与原先的值发生collision的话可以篡改数据而不被发现,但是这个的难度取决于HashFunction的选择),并且外部是无法改变签名中能算出的HashFunction的结果(因为这个需要Alice的密钥)。所以当Bob算出来的到H(m)= Hm' 的时候,就证明了信息并没有被篡改。
=========================================================
PS: 不知道是我太罗嗦还是怎么回事,回答个问题总是好长。。。。。
例如说,如果你想把某个消息秘密的发给某人,那你就可以用他的 公钥加密。因为只有他知道他的私钥,所以这消息也就只有他本人能解开,于是你就达到了你的目的。
但是如果你想发布一个公告,需要一个手段来证明这确实是你本人发的,而不是其他人冒名顶替的。那你可以在你的公告开头或者结尾附上一段用你的 私钥加密的内容(例如说就是你公告正文的一段话),那所有其他人都可以用你的公钥来解密,看看解出来的内容是不是相符的。如果是的话,那就说明这公告确实是你发的---因为只有你的公钥才能解开你的私钥加密的内容,而其他人是拿不到你的私钥的。
最后再说一下数字签名。
数字签名无非就两个目的:
证明这消息是你发的;
证明这消息内容确实是完整的---也就是没有经过任何形式的篡改(包括替换、缺少、新增)。
其实,上面关于“公告”那段内容,已经证明了第一点:证明这消息是你发的。
那么要做到第二点,也很简单,就是把你公告的原文做一次哈希(md5或者sha1都行),然后用你的 私钥加密这段哈希作为 签名,并一起公布出去。当别人收到你的公告时,他可以用你的 公钥解密你的签名,如果解密成功,并且解密出来的哈希值确实和你的公告原文一致,那么他就证明了两点:这消息确实是你发的,而且内容是完整的。
私钥加密公钥解密是签名,保证消息来源是私钥持有者。
目前的计算能力,公钥有效时间内推不出私钥,私钥也推不出公钥。这个不要钻牛角尖。
这问题是逼我爆发的呀,伸手党可耻你造吗?
来来来,让我一步一步的教你应该如何查资料。
第一个问题:
RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
第一步,搜一下RSA
好巧,第一条就是百度百科
RSA算法_百度百科
第二部,打开百度百科
目录分为概述、解释、安全性等等,紧接着就是正文。
等等,在正文的第一部分概述里面我似乎就发现了些什么?
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。因此用了不到一分钟的时间外加百度这个搜索引擎,我们很容易得到第一个问题的答案:
公钥用来加密,私钥用来解密。
好的,然后第二问题:
rsa的数字签名和加密怎么结合起来,能不能具体说明一下。
这个问题稍微复杂一点儿,因为问题本身就是错的!
RSA明明是一个加密算法,怎么会和数字签名扯上关系了呢?
百度一下数字签名,同样是百度百科 数字签名_百度百科
本来遇到错误的题目我一般都是没兴趣再回答下去了,但是既然都码了那么多字了我还是把题目改成一下然后继续回答吧。
改正后的题目: 数字签名和RSA怎么结合起来
百度百科第一段第二句话:
一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。如果你理解能力足够的话不难理解【签名】的意思就是加密,【验证】的意思就是解密
如果你因为对相关知识认识的还太少的话还可以继续往下看,很快到了第二点主要功能。
最后一段有非常醒目的一句话:
数字签名是个加密的过程,数字签名验证是个解密的过程。
所以数字签名使用的也是不对称密码体系,也就是公钥加密算法
而这个算法的绝大部分情况下就是RSA
回答完毕
------------------------------------分割线-----------------------------
不好意思我的语气可能不是太友好,但是我真心的希望题主以后在遇到“查了好多资料还是不懂”的问题时候可以尝试优化一下自己的资料获取方式,以及对于关键信息的获取方式。
以上
公钥加密 私钥解密 所有的公钥加密系统都是如此。
公钥加密的要点就是 私钥算出公钥的算法是多项式时间,公钥算出私钥的算法是指数时间。
所以破解密码非常困难。RSA算是个特例,公钥算私钥这个问题没人证出来是NPcomplete,也没人能找到多项式时间算法。有趣的是量子算法shor可以在多项式时间内把这个问题解出,所以保证RSA安全性的大数分解的问题,应该也就是多项式时间问题了。
你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出 公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出 私钥负责签名,公钥负责验证。
关于密码中的RSA算法和ecc(椭圆曲线)算法加密过程是怎样的? - 密码学
如果用于加密解密,那就是用公钥加密私钥解密(仅你可读但别人不可读,任何人都可写)
如果用于证书验证,那就是用私钥加密公钥解密(仅你可写但别人不可写,任何人都可读)
最后,RSA的公钥、私钥是互相对应的。RSA会生成两个密钥,你可以把任何一个用于公钥,然后另一个就是你必须保护好的私钥了。
实际应用中,公私钥加密有多种协议和算法,题外话,略。
假设 A 有公钥 Ka, 私钥 Da, B 有公钥 Kb, 私钥 Db . A 要发送 B 一个信息。A 先用自己的私钥 ka 加密信息(第一层),再用从B拿到的公钥Kb加密(第二层), 然后信息被发送。收到信息的 B 先用自己的私钥Db解第二层,再用从A拿到的公钥Ka解第一层。从而信息既是加密也是认证过的。
- 如果无密码登陆是要两台机的互联,每台机都必须生成自己的公钥和私钥,并把双方的公钥给对方。
- ssh具体实现是需要把公钥写入authorized_keys中,所以需要加入远程连接的那台机的公钥。
- 如果需要自己连接自己无密码的话,就需要把自己的公钥写入authorized_keys中。
-------------------------------------------------------------------------------------------------------------------------
公钥可以用来加密,也可以用来加密。
- 公钥用来解密是用在数字证书认证。例如A有私钥,这样公钥就可以公开了别人使用,用来解密你私钥加密的东西,并且确认你的身份。
- 公钥用来加密是用做数据加密的,这个倒不公开。