廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
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非对称加密算法的更多相关文章
- 廖雪峰Java10加密与安全-6数字证书-1数字证书
		
数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改
 - 廖雪峰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 ...
 - 廖雪峰Java10加密与安全-4加密算法-2口令加密算法
		
对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...
 - 廖雪峰Java10加密与安全-4加密算法-1对称加密算法
		
1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...
 - 廖雪峰Java10加密与安全-2加密算法-2Base64编码
		
1.Base64编码 Base64一种把二进制数据用文本表示的编码算法.例如 中有3个字节{\xe4, \xb8, \xad},一共是24位,每6位分组,变成4个字节{39, 0b, 22, 2d}, ...
 - 廖雪峰Java10加密与安全-2加密算法-1URL编码
		
1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu. ...
 - 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念
		
数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...
 - 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法
		
1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...
 - 廖雪峰Java10加密与安全-3摘要算法-5Hmac
		
1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...
 
随机推荐
- 缓冲(cache)和缓存(buffer)
			
缓存: 指把常用数据存储到可以快速获取的区域,以备重复利用 一般叫做cache. 缓存能提高效率 缓冲: 是指在数据流转过程中,不同层次速度不一致时,利用缓冲区来缓解上下层之间速率问题(性能差异) 一 ...
 - 阿里云CentOs7上安装JDK
			
一.查看服务器是否已经预装了JDK 在拿到新机器以后,要先看下机器上是否已经预装了JDK,命令: rpm -qa|grep jdk 如果有的话,卸载openjdk(无需输全称).命令: yum -y ...
 - SpringBoot--springboot启动类和controller的配置
			
作为一个springboot初学者,在探索过程中难免遇到一些坑,边看书边动手,发现书本中的版本是1.0,而我使用的是最新版2.0,所以有些东西不能完全按照书本进行操作,因为2.0中已经不支持1.0中的 ...
 - day  65  Django基础一之web框架的本质
			
Django基础一之web框架的本质 django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基 ...
 - 第十一篇:一点一滴学ibatis(一)
			
一.常见ORM框架1.原生的JDBC.自己写的JDBC,基本上就只够程序跑起来,缺陷和漏洞一堆堆.回顾下jdbc的几个操作,加载驱动,建立连接,预处理语句,执行,结果集遍历.这个过程中,因为连接Con ...
 - 19.SimLogin_case07
			
# 模拟登录豆瓣 from urllib.request import urlretrieve import requests from bs4 import BeautifulSoup from o ...
 - appium + python 自动化调试手机时 UiAutomator exited unexpectedly with code 0, signal null
			
放上appium报错图,appium在手机里安装了appium setting 和unlock 软件,输入法也被变成了appium input ,但是就是点不到目标软件,手机也可以被cmd adb ...
 - LJJ爱数数
			
LJJ爱数数 求\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\epsilon(gcd(i,j,k))(\frac{1}{i}+\frac{1}{j}==\frac{1} ...
 - 动软DbHelperSQL
			
using System; using System.Collections; using System.Data; using System.Data.SqlClient; using System ...
 - Oracle使用语句块之循环插入数据
			
1.业务要求: 将oracle表A的整表的数据一次性导入到表B中 , 以A_ID为外键关联. (*******如果开发环境和实际生产环境的数据一致,而且数据量比较小情况,可以直接手动添加数据; ** ...