1.非对称加密

非对称加密就是加密和解密使用的不是相同的密钥

  • 方法1:

    * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s

    * 解密:对方用自己的公钥解密:decrypt(publicKeyA, s)->message
  • 方法2:

    * 加密:用对方的公钥加密,然后发送给对方:ecrypt(publicKeyB, message)->s

    * 解密:对方用自己的私钥解密:decrypt(privateKeyB, s) -> message

    非对称加密典型算法:RSA(3个发明人名字的缩写)

2.代码示例

package com.testList;

import org.bouncycastle.jcajce.provider.symmetric.ARC4;

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64; public class RSAKeyPair {
PrivateKey sk;//私钥
PublicKey pk;//公钥
//构造方法1:生成公钥/私钥对
public RSAKeyPair() throws GeneralSecurityException {
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
kpGen.initialize(1024);//初始化,密钥长度为1024位
KeyPair kp = kpGen.generateKeyPair();//生成KeyPair
this.sk = kp.getPrivate();//通过getPrivate()生成私钥
this.pk = kp.getPublic();//通过getPublic()生成公钥
}
//构造方法2:从已保存的字节中(例如,读取文件)恢复公钥/私钥
public RSAKeyPair(byte[] pk, byte[] sk) throws GeneralSecurityException{
KeyFactory kf = KeyFactory.getInstance("RSA");
//恢复公钥
X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(pk);
this.pk = kf.generatePublic(pkSpec);
//恢复私钥
PKCS8EncodedKeySpec skSpec = new PKCS8EncodedKeySpec(sk);
this.sk = kf.generatePrivate(skSpec);
}
//把私钥导出为字节数组
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[] decrpt(byte[] input) throws GeneralSecurityException{
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,this.sk);
return cipher.doFinal(input);
}
public static void main(String[] args) throws Exception{
byte[] plain = "Hello,使用RSA非对称加密算法对数据进行加密!".getBytes("utf-8");
//创建公钥和私钥对
RSAKeyPair rsa = new RSAKeyPair();
//加密
byte[] encrypted = rsa.encrypt(plain);
System.out.println("encrypted:"+ Base64.getEncoder().encodeToString(encrypted));
byte[] decrypted = rsa.decrpt(encrypted);
System.out.println("decryted:"+new String(decrypted));
//保存公钥和私钥
byte[] sk = rsa.getPrivateKey();
byte[] pk = rsa.getPublicKey();
System.out.println("pk:"+Base64.getEncoder().encodeToString(pk));
System.out.println("sk"+Base64.getEncoder().encodeToString(sk));
//重新恢复公钥和私钥
RSAKeyPair rsa2 = new RSAKeyPair(pk,sk);
//加密
byte[] encrypted2 = rsa2.encrypt(plain);
System.out.println("encrypted2:"+Base64.getEncoder().encodeToString(encrypted2));
//解密
byte[] decrypted2 = rsa2.decrpt(encrypted2);
System.out.println("decrypted2:"+new String(decrypted2));
}
}

3.非对称加密算法优缺点:

  • 优点

    * 对称加密需要协商密钥,而非对称加密可以安全地公开各自的公钥

    * N个人之间通信:

    • 使用非对称加密只需要N个密钥对。每个人值管理自己的密钥对
    • 使用对称加密需要N*(N-1)/2个密钥。每个人需要管理N-1个密钥
  • 缺点:速度慢

4.总结:

  • 非对称加密就是加密和解密使用的不是相同的密钥
  • 只有同一个公钥/私钥对才能正常加密/解密
  • 只使用非对称加密算法不能防止中间人攻击

廖雪峰Java10加密与安全-4加密算法-5非对称加密算法的更多相关文章

  1. 廖雪峰Java10加密与安全-6数字证书-1数字证书

    数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改

  2. 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法

    1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...

  3. 廖雪峰Java10加密与安全-4加密算法-2口令加密算法

    对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...

  4. 廖雪峰Java10加密与安全-4加密算法-1对称加密算法

    1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...

  5. 廖雪峰Java10加密与安全-2加密算法-2Base64编码

    1.Base64编码 Base64一种把二进制数据用文本表示的编码算法.例如 中有3个字节{\xe4, \xb8, \xad},一共是24位,每6位分组,变成4个字节{39, 0b, 22, 2d}, ...

  6. 廖雪峰Java10加密与安全-2加密算法-1URL编码

    1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu. ...

  7. 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念

    数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...

  8. 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法

    1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...

  9. 廖雪峰Java10加密与安全-3摘要算法-5Hmac

    1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...

随机推荐

  1. 校园商铺-4店铺注册功能模块-6店铺注册之Controller层的实现

    1. 从request请求获取获取相关的值 HttpservletRequest request代表的是客户端的请求.当客户端通过http协议访问服务器的时候,http请求头中的所有信息,都封装在这个 ...

  2. day30 python类的继承,抽象类等

    Python之路,Day17 = Python基础17-面向对象入门 继承 class Student(People): pass print(Student.__bases__) # 查看 Stud ...

  3. oxyplot 禁止拖动,缩放

      <oxy:Plot> IsZoomEnabled= IsPanEnabled=/> IsZoomEnabled= IsPanEnabled=/> 关键代码: IsZoomE ...

  4. swiper在loop模式,当轮播到最后一张图时候,做其他事件

    1.引入文件: <link rel="stylesheet" href="css/swiper.min.css"> <script src=& ...

  5. 大型SQL文件导入mysql方案

    一. 场景 现有俩个体积较大的单表sql文件,一个为8G,一个为4G,要在一天内完整导入到阿里云的mysql中,需要同时蛮子时间和空间这俩种要求. 二. 思路 搜索了网上一堆的方案,总结了如下几个: ...

  6. angularJS ng-repeat="item in XXX track by $index"问题记录

    参考:https://blog.csdn.net/lunhui1994_/article/details/80236315 问题:项目中对数据做了分页效果,理想是:当页数大于6时,隐藏>6的页数 ...

  7. JS流程控制语句 做判断(if语句)if语句是基于条件成立才执行相应代码时使用的语句。语法:if(条件) { 条件成立时执行代码}

    做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位,如果 ...

  8. springboot2.0 使用aop实现PageHelper分页

    参考: https://blog.csdn.net/qq_24076135/article/details/85212081 https://www.jianshu.com/p/036d31ae77d ...

  9. Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

    Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁[转] 标签: javajvm监控工具性能优化 2015-03-11 19:59 1948人阅读 评论(0) 收藏  ...

  10. zabbix被监控端代理设置

    zabbix被监控端代理设置 安装zabbix-agent客户端 rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-re ...