一、非对称式加密
非对称密码指的是加密和解密使用的不是相同的钥匙,用户A密钥加密后的信息只有他自己用解密密钥才能解密。如果知道了其中一个密钥,并不能计算另一个。因此公开一对密钥中的一个,并不会危害到另一个的秘密性质。我们将公开是密钥称为公钥,不公开的称为私钥。只有用同一个公钥-私钥才能进行正常的加密解密。常用的非对称算法有RSA、ECC等。以下是用RSA算法的案例。
二、RSA算法
例:
Bob想要发一个信息给Alice,Bob首先应该要想Alice索要她的公钥,然后用Alice提供的公钥把信息加密,再把密文发给Alice,此文件只有用Alice的私钥才能解开,又因为只有Alice才有私钥,除了Alice,没有其他人能解开此密文。
Java标准库中提供了RSA算法的实现,案例代码如下:
import java.math.BigInteger;
import java.security.GeneralSecurityException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
// RSA
public class Work04 {
public static void main(String[] args) throws Exception {
// 明文:
byte[] plain = "Alice, I love you~".getBytes("UTF-8");
// 创建公钥/私钥对
Human bob = new Human("Bob");
Human alice = new Human("Alice");
// 小明使用小红的公钥进行加密
// 1.获取小红的公钥
PublicKey alicePublicKey = alice.getPublicKey();
System.out.println(String.format("Alice的public key(公钥): %x", new BigInteger(1, alicePublicKey.getEncoded())));
// 2.使用公钥加密
byte[] encrypted = bob.encrypt(plain, alicePublicKey);
System.out.println(String.format("encrypted(加密): %x", new BigInteger(1, encrypted)));
// 小红使用自己的私钥解密:
// 1.获取小红的私钥,并输出
PrivateKey alicePrivateKey = alice.getPrivateKey();
System.out.println(String.format("Alice的private key(私钥): %x", new BigInteger(1, alicePrivateKey.getEncoded())));
// 2.使用私钥解密
byte[] decrypted = alice.decrypt(encrypted);
System.out.println("decrypted(解密): " + new String(decrypted, "UTF-8"));
}
}
// 用户类
class Human {
// 姓名
String name;
// 私钥:
PrivateKey privatekey;
// 公钥:
PublicKey publickey;
// 构造方法
public Human(String name) throws GeneralSecurityException {
// 初始化姓名
this.name = name;
// 生成公钥/私钥对:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair keyPair = keyGen.generateKeyPair();
this.privatekey = keyPair.getPrivate();
this.publickey = keyPair.getPublic();
}
// 返回私钥
public PrivateKey getPrivateKey() {
return this.privatekey;
}
// 返回公钥
public PublicKey getPublicKey() {
return this.publickey;
}
// 用公钥加密
public byte[] encrypt(byte[] message, PublicKey publickey) throws GeneralSecurityException {
// 使用公钥进行初始化
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publickey);
return cipher.doFinal(message);
}
// 用私钥解密:
public byte[] decrypt(byte[] input) throws GeneralSecurityException {
// 使用私钥进行初始化
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, this.privatekey);
return cipher.doFinal(input);
}
}
总结
非对称加密就是加密和解密使用不同的密钥,只有同一个公钥-私钥才能正常的加解密。
特点:非对称式加密算法的安全性非常高,但是运算速度非常的慢,比对称加密要慢得多。