[b]一、什么是非对称加密算法[/b]

加密和解密所用的密钥是不一样的,所以叫“非对称”。
非对称加密算法的这两个密钥,一个称为公钥,一个称为私钥。

所谓公钥和私钥不是绝对的,公钥和私钥只是经过算法运算得到的一对数值,公开的那一个值称为公钥,不公开的称为私钥。
用公钥加密的,可以用私钥解密,反过来也成立。

RSA就是典型的非对称加密算法。
关于RSA算法的解释,最经典的当然是阮一峰老师的博客了:
[url]http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html[/url]
[url]http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html[/url]
想当初我看懂之后还在纸上自己推导了一遍,可惜后来又忘记了,只记得一个欧拉定理。。

[b]二、使用非对称加密算法通信的原理[/b]

由于非对称加密算法一般比较慢,因此他一般用于密钥交换。这个交换的密钥就是指对称密钥。

通常,发送方用公钥加密,接收方用私钥解密。假如你是接收方,你可以把公钥公开出去,那其他人想要与你通信时,先用你的公钥把对称密钥加密后传递给你,你再通过私钥解密得到对称密钥。从这以后,双方都有对称密钥了,双方的通信信息就通过这个密钥来加密解密。

知乎上的一个回答说明了同样的过程([url]https://www.zhihu.com/question/20744215/answer/16056710[/url]):

假设我们回到了那个只能寄信的时代,大家都需要和知乎通信,而且通信的内容必须要保密。于是负责接收大家消息的@顾惜朝 想出来一个办法,找了很多把上面说的那种锁(公钥),都用钥匙打开,挂在外面。需要和知乎通信的人,在通信之前,需要拥有另外一把有两个钥匙的锁(对称加密算法),然后把这把锁和其中一把钥匙(对称密钥),放进一个无法被破拆的铁盒子里面,用知乎提供的那把开着的锁把铁盒子锁上。

这时候,这个铁盒子就无法打开了,除了拥有钥匙的顾惜朝。这个装有一把锁和钥匙的铁盒子,可以放心地交到任何一个人手上,然后让他拿去给顾惜朝。顾惜朝拿到这个铁盒子之后,加密通信会话就建立了。她就会用钥匙打开铁盒子,取出锁和钥匙,写下“亲爱的知乎用户,你好,我是顾惜朝”小纸条,放进铁盒子里,然后用你提供的锁把铁盒子锁上,然后交回到你的手上。这个时候,铁盒子被你提供的锁锁上了,除了你和顾惜朝,没有别人有钥匙能够打开这个铁盒子,铁盒子也就可以安全地经过邮递送到你的手上;你收到铁盒子之后,用你自己的钥匙打开锁,读铁盒子里面的消息,然后放进新的小纸条,再寄送回去。

以上就是加密通信的过程。

[b]三、实际例子[/b]
3.1 https的通信建立就是用RSA:

[img]http://dl2.iteye.com/upload/attachment/0115/1470/e0f8accd-2e9a-3e63-9338-92e7b002367b.png[/img]

第三步的crt public就是服务端的公钥(传说中的证书,当然证书还会包含其他信息),发给了客户端。
第五步的random key就是对称密钥。第五步完成后,对称密钥就交换成功了。

3.2 http接口远程调用参数的加密
以实际项目中,调用A公司的http接口为例:
假设params是可以在公网上安全传输的值,显然不能是明文,那它是怎么来的呢:
伪代码:

params=encrypt(merchantId=111&sences=222&productId=333&extParams=444)

其中的merchantId=111&sences=222&productId=333&extParams=444就是要传递的参数。
加密方法encrypt分三步:用A公司公钥(A公司的私钥在它们那里,不公开)加密再用base64编码再经过url-encode。
可以推知,A公司的解密过程就是先url-decode再base64解密,最后用它的私钥解密得到消息的明文。

那如何保证消息明文没有被篡改呢?
此时就需要我们调用传参时,同时传递数字签名:

假设上一步算得params="555",则最后在http报文体中传递的就是params=555&sign=888,而这个sign就是数字签名:
先hash再用我们的私钥(我们的公钥会直接给到A公司的开发人员,A公司的公钥也是直接给到我们)加密:

String digest = sha1(params);String rawSign = encodeByPrivateKey(digest);String sign = urlEncode(rawSign);

可以看到,数字签名不是一成不变的,它随着消息的改变而改变。它与我们现实中的个人签名不同,个人签名每次都是签同一个名字。

A公司接收到签名后,用我们的公钥解密得到消息摘要(假设为digestX),然后把之前解密得到的消息明文hash一下,得到digestY,比较这两个值是否相等,则可以知道消息有没有被篡改。
说到这里我们发现,我们需要提前与A公司协定好hash算法(例如sha1)。

那黑客有没有可能同时篡改消息和签名呢?不可以,因为他没有我们的私钥,改不了签名。
在这http调用过程中,总结一句话:
用对方的公钥来加密消息,用我们自己的私钥来签名。

非对称加密算法原理及应用相关推荐

  1. 【信息安全】RSA非对称加密算法原理(详解和C++代码实现)

    1.RSA非对称加密 (1)选择两个素数p和q ,计算n=p*q和欧拉函数φ(n)=(p-1)(q-1),选择整数e,使gcd(φ(n), e)=1(即φ(n)和e是互素),1<e<φ(n ...

  2. 非对称加密算法--RSA加密原理及运用

    密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学. 密码学发展史 在说RSA加密算法之前, 先说下密码学的发展史.其实密码学的诞生,就是为了运用 ...

  3. 加密算法---RSA 非对称加密原理及使用

    加密算法---RSA 非对称加密原理及使用 一 非对称加密原理介绍 二 加密解密测试 2.1 加密解密工具类 2.2 测试 一 非对称加密原理介绍 非对称加密算法中,有两个密钥:公钥和私钥.它们是一对 ...

  4. 经典非对称加密算法:RSA算法原理、实现详解(C++、Java)

    目录 零.写在最前 参数说明 一.RSA算法原理介绍 二.实验步骤(含实验方法与关键代码) 1. 创建项目 2. 设计加密.解密的总体流程 3. 设计素数类PrimeNum,包括两个静态方法 4. 设 ...

  5. rsa加密原理数学证明_非对称加密算法——RSA加密原理及数学推导

    说明:原创不易,著作权仅归作者本人所有,转载请注明出处. 建议:建议阅读时间15min+.证明过程可能看着枯燥,需要动手. 一.  RSA是什么? 看到标题的第一瞬间,先想一下,RSA是什么呢?百度百 ...

  6. 公钥密码-非对称加密算法

    公钥密码-非对称加密算法 1976年美国斯坦福大学的两名学者迪菲和赫尔曼提出了公开密钥密码体制的概念,其原理是加密密钥和解密密钥分离.这样,用户就可以将加密密钥和算法公诸于众,而只保密解密密钥.任何人 ...

  7. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  8. .NET Core加解密实战系列之——RSA非对称加密算法

    简介 加解密现状,编写此项目的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java) 网上资料版本不一.不全面 .NET官方库密码算法提供不全面,很难针对其 ...

  9. 非对称加密算法 --- RSA签名算法

    目录 RSA原理 RSA应用场景 RSA加密场景 RSA签名场景 RSA加解密和签名算法的java实现 RSA原理 通过一定的规则,生成公钥和私钥,公钥和私钥总是成对出现. 公钥可以公开出去,任何人都 ...

最新文章

  1. [THUWC2017]随机二分图
  2. 人工智能导论笔记——江湖救急版
  3. 没有有效IP配置,无Internet访问,未识别的网络解决方法
  4. 【设计模式】外观模式
  5. 干掉耐克的,绝不会是下一个耐克?
  6. TensorFlow 2.0快速上手指南12条:“Keras之父”亲授 | 高赞热贴
  7. drools6.5_使用Drools 6.0进行部署
  8. python发布_python网站发布
  9. 服务器ios文件,ios 文件到服务器
  10. swift语言 编写 ios开发 第一个程序hello world!
  11. tar:归档中找不到 tar: 由于前次错误,将以上次的错误状态退出
  12. dbeaver驱动问题解决方案
  13. Zookeeper的一些概念
  14. STM32电机测速(正交或者霍尔编码器)
  15. 如何用HTML和css实现简单的手风琴菜单效果,附带详细注释
  16. LD3320语音识别模块开发
  17. uni-app第三方登录
  18. 用深度学习keras的cnn做图像识别分类,准确率达97%
  19. 环世界RimWorld for Mac(模拟建造游戏)
  20. 2015年百度之星程序设计大赛 - 初赛(2)

热门文章

  1. nodejs基于vue小社区报修维修平台
  2. [开源工具]Win10-87键盘如何使用数字小键盘功能?
  3. 项目架构相关知识的个人简单理解(水平有限,勿喷)
  4. MySQL超过800G的大表优化方案
  5. 亚马逊干货|极致细节优化 爆款listing这样产出
  6. 宝塔/服务器中的项目不在wwwroot目录下,要修改的文件
  7. 文献阅读-ICRA2020-用于机器人手术器械的实时细分的注意力引导的轻型网络
  8. java算法集训结果填空题练习1
  9. android中的标签,如何在Android中使用标签
  10. 微信小程序api概述