1. 概念
- 是一种针对密钥的保密传输算法
- 算法复杂,耗时较长,安全性高
- 最广泛使用的算法是RSA,其它的还有Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等
- 一般使用场景
- 甲方在客户端生成公钥、私钥
- 将公钥公布出来,给通信的乙方
- 乙方客户端随机生成对称加密的密钥
- 将密钥,使用公钥进行加密,传输给甲
- 乙方用对称加密的密钥,加密信息,也传输给甲
- 甲用自己的私钥,解密出用公钥加密的对称加密的密钥,用这个密钥解密信息
2. 示例
public class RSATest {
public static class User {
private String name; //姓名
private PublicKey publicKey; //公钥
private PrivateKey privateKey; //私钥
public User(String name) throws NoSuchAlgorithmException {
this.name = name;
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
kpGen.initialize(512); //密钥大小,也有1024,2048长度
KeyPair keyPair = kpGen.generateKeyPair(); //生成自己的密钥对
this.publicKey = keyPair.getPublic();
this.privateKey = keyPair.getPrivate();
}
//公钥加密
public byte[] encrypt(byte[] message) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");//指定算法
cipher.init(cipher.ENCRYPT_MODE, this.publicKey); //加密模式,使用公钥
return cipher.doFinal(message);
}
//私钥解密
public byte[] decrypt(byte[] message) throws Exception {
Cipher cipher = Cipher.getInstance("RSA"); //指定算法
cipher.init(cipher.DECRYPT_MODE, this.privateKey); //解密模式,使用私钥
return cipher.doFinal(message); //解密
}
//输出公钥私钥,密钥
public void printInfo() {
System.out.println("name:" + this.name);
System.out.printf("公钥:%x\n",new BigInteger(1,this.publicKey.getEncoded()));
System.out.printf("私钥:%x\n",new BigInteger(1,this.privateKey.getEncoded()));
}
}
public static void main(String[] args) throws Exception {
String message = "你好!";
byte[] messageData = message.getBytes("UTF-8");
User user = new User("小明");
//输出密钥对
user.printInfo();
//公钥加密信息
byte[] encryptData = user.encrypt(messageData);
//私钥解密信息
byte[] decryptData = user.decrypt(encryptData);
System.out.println("解密后内容:" + new String(decryptData,"UTF-8"));
}
}
//====输出====
//name:小明
//公钥:
305c300d06092a864886f70d0101010500034b00304802410086ddfe7ffefbb5affb4525e302bf2334c150cf07ad67cc7525e967d1a8c6d8c5754915982fbd418b101802f168db7da410b477be5f71742c89151ece817a00390203010001
//私钥:
30820154020100300d06092a864886f70d01010105000482013e3082013a02010002410086ddfe7ffefbb5affb4525e302bf2334c150cf07ad67cc7525e967d1a8c6d8c5754915982fbd418b101802f168db7da410b477be5f71742c89151ece817a0039020301000102401c23b1782f518185285e331b7c7538f946e47f6dd0a679a86fb29570cf503de61705bf512d3f0e1926a4950305e9ae0dd047e783a3953506541c932467cd9c69022100d202c11db21f861eb41de47bad83a02164bb376fdbaf1dc106a8fa45ff9dbb1b022100a466acb7103d6718d8c7d6ccfeb0cb35cb5b3e84998909b510772a3e63a4b33b0221008ce9b8367abc583be5d360e9f3a52c1efbfdfad69d6b44e5add85805fbdc141d02203d876ffcd3c7275ed54375d1234167ccaa5f6bf694c005320f078a77ef332521022013262f95175427d9755cbe85eae63c06cb854b2b2c5423ea8e431d8eae930fe9
//解密后内容:你好!
大家可以发现私钥的长度要比公钥长很多!
网友评论