从DH算法我们可以看到,公钥-私钥组成的密钥对是非常有用的加密方式,因为公钥是可以公开的,而私钥是完全保密的,由此奠定了非对称加密的基础。

非对称加密就是加密和解密使用的不是相同的密钥:只有同一个公钥-私钥对才能正常加解密。

因此,如果小明要加密一个文件发送给小红,他应该首先向小红索取她的公钥,然后,他用小红的公钥加密,把加密文件发送给小红,此文件只能由小红的私钥解开,因为小红的私钥在她自己手里,所以,除了小红,没有任何人能解开此文件。

非对称加密的典型算法就是RSA算法,它是由Ron Rivest,Adi Shamir,Leonard Adleman这三个哥们一起发明的,所以用他们仨的姓的首字母缩写表示。

非对称加密相比对称加密的显著优点在于,对称加密需要协商密钥,而非对称加密可以安全地公开各自的公钥,在N个人之间通信的时候:使用非对称加密只需要N个密钥对,每个人只管理自己的密钥对。而使用对称加密需要则需要N*(N-1)/2个密钥,因此每个人需要管理N-1个密钥,密钥管理难度大,而且非常容易泄漏。

既然非对称加密这么好,那我们抛弃对称加密,完全使用非对称加密行不行?也不行。因为非对称加密的缺点就是运算速度非常慢,比对称加密要慢很多。

所以,在实际应用的时候,非对称加密总是和对称加密一起使用。假设小明需要给小红需要传输加密文件,他俩首先交换了各自的公钥,然后:

  1. 小明生成一个随机的AES口令,然后用小红的公钥通过RSA加密这个口令,并发给小红;
  2. 小红用自己的RSA私钥解密得到AES口令;
  3. 双方使用这个共享的AES口令用AES加密通信。

可见非对称加密实际上应用在第一步,即加密“AES口令”。这也是我们在浏览器中常用的HTTPS协议的做法,即浏览器和服务器先通过RSA交换AES口令,接下来双方通信实际上采用的是速度较快的AES对称加密,而不是缓慢的RSA非对称加密。

Java标准库提供了RSA算法的实现,示例代码如下:

import java.math.BigInteger;
import java.security.*;
import javax.crypto.Cipher;public class Main {public static void main(String[] args) throws Exception {// 明文:byte[] plain = "Hello, encrypt use RSA".getBytes("UTF-8");// 创建公钥/私钥对:Person alice = new Person("Alice");// 用Alice的公钥加密:byte[] pk = alice.getPublicKey();System.out.println(String.format("public key: %x", new BigInteger(1, pk)));byte[] encrypted = alice.encrypt(plain);System.out.println(String.format("encrypted: %x", new BigInteger(1, encrypted)));// 用Alice的私钥解密:byte[] sk = alice.getPrivateKey();System.out.println(String.format("private key: %x", new BigInteger(1, sk)));byte[] decrypted = alice.decrypt(encrypted);System.out.println(new String(decrypted, "UTF-8"));}
}class Person {String name;// 私钥:PrivateKey sk;// 公钥:PublicKey pk;public Person(String name) throws GeneralSecurityException {this.name = name;// 生成公钥/私钥对:KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");kpGen.initialize(1024);KeyPair kp = kpGen.generateKeyPair();this.sk = kp.getPrivate();this.pk = kp.getPublic();}// 把私钥导出为字节public byte[] getPrivateKey() {return this.sk.getEncoded();}// 把公钥导出为字节public byte[] getPublicKey() {return this.pk.getEncoded();}// 用公钥加密:public byte[] encrypt(byte[] message) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, this.pk);return cipher.doFinal(message);}// 用私钥解密:public byte[] decrypt(byte[] input) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, this.sk);return cipher.doFinal(input);}
}

RSA的公钥和私钥都可以通过getEncoded()方法获得以byte[]表示的二进制数据,并根据需要保存到文件中。要从byte[]数组恢复公钥或私钥,可以这么写:

byte[] pkData = ...
byte[] skData = ...
KeyFactory kf = KeyFactory.getInstance("RSA");
// 恢复公钥:
X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(pkData);
PublicKey pk = kf.generatePublic(pkSpec);
// 恢复私钥:
PKCS8EncodedKeySpec skSpec = new PKCS8EncodedKeySpec(skData);
PrivateKey sk = kf.generatePrivate(skSpec);

以RSA算法为例,它的密钥有256/512/1024/2048/4096等不同的长度。长度越长,密码强度越大,当然计算速度也越慢。

如果修改待加密的byte[]数据的大小,可以发现,使用512bit的RSA加密时,明文长度不能超过53字节,使用1024bit的RSA加密时,明文长度不能超过117字节,这也是为什么使用RSA的时候,总是配合AES一起使用,即用AES加密任意长度的明文,用RSA加密AES口令。

此外,只使用非对称加密算法不能防止中间人攻击。

小结

非对称加密就是加密和解密使用的不是相同的密钥,只有同一个公钥-私钥对才能正常加解密;

只使用非对称加密算法不能防止中间人攻击。

加密与安全——非对称加密算法相关推荐

  1. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  2. RSA - 非对称加密算法简要介绍与JAVA实现

    [1]RSA简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年 ...

  3. 【安全加密技术】非对称加密

    转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46810595 看过上篇网络互联基系列基础的朋友,对安全产生的原因以及策略度有所了解 ...

  4. 快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密算法和非对称加密算法.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥 ...

  5. Python代码实现MD5、AES对称加密和RSA非对称加密以及OpenSSl实践

    1.MD5加密算法 1.1 MD5加密的特点 不可逆运算 对不同的数据加密的结果是定长的32位和16位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制). 抗修改性 :信息 ...

  6. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)...

    2019独角兽企业重金招聘Python工程师标准>>> 数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊-- ...

  7. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) 2.简单的例子 ...

  8. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  9. python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能

    摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...

最新文章

  1. 多线程学习-基础(四)常用函数说明:sleep-join-yield
  2. linux 当前活动用户,如何在Linux上自动记录所有用户的终端会话活动
  3. 成功解决Exception “unhandled ImportError“cannot import name ‘imread‘ from ‘scipy.misc‘
  4. 排序方法分析与代码实现
  5. 错误日志的实时抓取保证代码质量
  6. ON TOP-N and pagination queries
  7. 将登录等信息保存到session中和退出session
  8. Ios开发之定位CLLocationManager
  9. Centos/Linux在线环境下载安装包,到离线环境安装,并解决依赖问题
  10. oracle数据库查询下级_Oracle 图技术
  11. Codeforces 71A Way Too Long Words
  12. VMD变分模态分解代码,C++代码下载
  13. uni-app实现XCode苹果本地离线打包APP
  14. 这样设计积分兑换系统,让你的用户“活”起来
  15. 思维转换--等价换位思考
  16. 绎维软件F-One获得B轮融资,华创资本领投,齐银基金跟投...
  17. ContentProvider使用Demo
  18. 3900x做服务器性能怎么样,【茶茶】AMD YES?AMD R9 3900X测试报告
  19. lua 自实现pairs
  20. 如何用dark reader

热门文章

  1. python对excel指定数据提取并保存到另一excel表中(一)
  2. c语言kbhit函数6,C语言中kbhit()函数怎么复位
  3. 如何在线制作gif图片?
  4. 连续办了16年,为什么阿里坚持搞集体婚礼?
  5. 神器 | 教你去除视频马赛克
  6. 项目管理——如何制定生产计划控制生产进度
  7. 6iypl8php,无线超方便 YPL TL-1/TL-3蓝牙音箱新品上市
  8. seo和sem有什么关系
  9. 开通公众号啦:java4all
  10. OCSP 在SSL证书中起什么作用