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. PHP正则使用技巧1

    $pattern="/<div class=\"cover g-playicon\">(.*?)>/s"; 意思为抓取<div clas ...

  2. elasticsearch+filebeat+kibana提取多行日志

    filebeat的配置文件filebeat.yml以下三行去掉注释 multiline.pattern: ^\[ multiline.negate: true //false改为true multil ...

  3. (转)详解HttpURLConnection

    请求响应流程 设置连接参数的方法 setAllowUserInteraction setDoInput setDoOutput setIfModifiedSince setUseCaches setD ...

  4. python基于SMTP发送邮件

    import smtplib from email.header import Header from email.mime.text import MIMEText ''' SMTP是发送邮件的协议 ...

  5. assert(断言)

    Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常. 语法格式: assert expression 等价于: if not expression: ra ...

  6. Codeigniter 获取当前的控制器名称和方法名称

    在Codeigniter 可以通过下面两个方法获取当前的控制器名称和方法名称 $this->router->fetch_class(); $this->router->fetc ...

  7. js怎样截取字符串后几位以及截取字符串前几位

    想要截取字符串前几位与后几位,主要代码如下 截取字符串前几位 var disName ='开心一族漂亮家园'; var shortName = disName.substring(0,5); cons ...

  8. WPF 免费控件库

    https://github.com/Infragistics/InfragisticsThemesForMicrosoftControls 几款WPF免费控件库,不过运行源码时需要下载三个DLL , ...

  9. HZOI20190725 B 回家 tarjan

    题目大意:https://www.cnblogs.com/Juve/articles/11226266.html 题解: 感觉挺水的,但考场上没打出来 题目翻译一下就是输出起点到终点必经的点 其实就是 ...

  10. Centos--swoole平滑重启服务

    平滑重启: 已经打开的服务: 首先在server服务中为进程添加名字: /** * @param $server */ public function onStart($server) { swool ...