TestAesAndRsa
package com.zhuyun.test;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.SecretKey;
import org.junit.Test;
import com.zhuyun.aes.AESUtil;
import com.zhuyun.rsa.RSAUtil;
public class TestAesAndRsa {
//測(cè)試RSA與AES的結(jié)合谦秧。
// 客戶端用公鑰加密AES秘鑰追驴,AES秘鑰加密實(shí)際內(nèi)容;
// 服務(wù)端用私鑰解密AES秘鑰,AES秘鑰解密實(shí)際內(nèi)容
@Test
public void testAesAndRsa() throws Exception {
//===============生成公鑰和私鑰酷誓,公鑰傳給客戶端,私鑰服務(wù)端保留==================
//生成RSA公鑰和私鑰,并Base64編碼裸准,生成一次以后,就寫死在配置文件或代碼中赔硫,下次不再重新生成
KeyPair keyPair = RSAUtil.getKeyPair();
String publicKeyStr = RSAUtil.getPublicKey(keyPair);
String privateKeyStr = RSAUtil.getPrivateKey(keyPair);
System.out.println("RSA公鑰Base64編碼:" + publicKeyStr);
System.out.println("RSA私鑰Base64編碼:" + publicKeyStr);
//=================客戶端=================
//hello, i am infi, good night! 需要加密的實(shí)際內(nèi)容
String message = "hello, i am infi, good night!";
//將Base64編碼后的公鑰轉(zhuǎn)換成PublicKey對(duì)象
PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr);
//生成AES秘鑰炒俱,并Base64編碼
String aesKeyStr = AESUtil.genKeyAES();
System.out.println("AES秘鑰Base64編碼:" + aesKeyStr);
//用公鑰加密AES秘鑰
byte[] publicEncrypt = RSAUtil.publicEncrypt(aesKeyStr.getBytes(), publicKey);
//公鑰加密AES秘鑰后的內(nèi)容Base64編碼
String publicEncryptStr = RSAUtil.byte2Base64(publicEncrypt);
System.out.println("公鑰加密AES秘鑰并Base64編碼的結(jié)果:" + publicEncryptStr);
//將Base64編碼后的AES秘鑰轉(zhuǎn)換成SecretKey對(duì)象
SecretKey aesKey = AESUtil.loadKeyAES(aesKeyStr);
//用AES秘鑰加密實(shí)際的內(nèi)容
byte[] encryptAES = AESUtil.encryptAES(message.getBytes(), aesKey);
//AES秘鑰加密后的內(nèi)容Base64編碼
String encryptAESStr = AESUtil.byte2Base64(encryptAES);
System.out.println("AES秘鑰加密實(shí)際的內(nèi)容并Base64編碼的結(jié)果:" + encryptAESStr);
//############## 網(wǎng)絡(luò)上傳輸?shù)膬?nèi)容有Base64編碼后的公鑰加密AES秘鑰的結(jié)果 和 Base64編碼后的AES秘鑰加密實(shí)際內(nèi)容的結(jié)果 #################
//############## 即publicEncryptStr和encryptAESStr ###################
//===================服務(wù)端================
//將Base64編碼后的私鑰轉(zhuǎn)換成PrivateKey對(duì)象
PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr);
//公鑰加密AES秘鑰后的內(nèi)容(Base64編碼),進(jìn)行Base64解碼
byte[] publicEncrypt2 = RSAUtil.base642Byte(publicEncryptStr);
//用私鑰解密,得到aesKey
byte[] aesKeyStrBytes = RSAUtil.privateDecrypt(publicEncrypt2, privateKey);
//解密后的aesKey
String aesKeyStr2 = new String(aesKeyStrBytes);
System.out.println("解密后的aesKey(Base64編碼): " + aesKeyStr2);
//將Base64編碼后的AES秘鑰轉(zhuǎn)換成SecretKey對(duì)象
SecretKey aesKey2 = AESUtil.loadKeyAES(aesKeyStr2);
//AES秘鑰加密后的內(nèi)容(Base64編碼)爪膊,進(jìn)行Base64解碼
byte[] encryptAES2 = AESUtil.base642Byte(encryptAESStr);
//用AES秘鑰解密實(shí)際的內(nèi)容
byte[] decryptAES = AESUtil.decryptAES(encryptAES2, aesKey2);
//解密后的實(shí)際內(nèi)容
System.out.println("解密后的實(shí)際內(nèi)容: " + new String(decryptAES));
}
}
關(guān)于RSAUtil 和AESUtil這兩個(gè)類权悟,詳見(jiàn)我的前面兩篇博客《java實(shí)現(xiàn)RSA的簡(jiǎn)單加密解密》和 《java實(shí)現(xiàn)AES的簡(jiǎn)單加密解密》
運(yùn)行結(jié)果如下:
RSA公鑰Base64編碼:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3edVb1wjqKNucCPW7/0Ct4lFBVdEVZyD
tT+cbzncvnHokEzNj2bRUSk0sR4YBUscPyR5H8c5p2MgRcuLLMWzXBpUS4TO+NHfLzzj30WPcqIL
MaO6nIMCqH6zn3Bz0my56Gx7hHUI+D7ija/JtroLQiI9Z69pljtxjEfX7Oa7EgDWc0uhPh+grhHD
LCsdibn5Czpc+GkkRYOV9iPIaia3+h2Eqyj9WOOxd6czsgGEjO8+g28Kl7CLKzwE1RUYEZmu+Tch
U2417ejpAjyhR/2rdE1l9US75Tz0/6RFDCTTo13ZLsN/PSVfyZtZ0CLjsCAjimDq2GR1qVU0K7XE
SBrDuwIDAQAB
RSA私鑰Base64編碼:MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDd51VvXCOoo25wI9bv/QK3iUUF
V0RVnIO1P5xvOdy+ceiQTM2PZtFRKTSxHhgFSxw/JHkfxzmnYyBFy4ssxbNcGlRLhM740d8vPOPf
RY9yogsxo7qcgwKofrOfcHPSbLnobHuEdQj4PuKNr8m2ugtCIj1nr2mWO3GMR9fs5rsSANZzS6E+
H6CuEcMsKx2JufkLOlz4aSRFg5X2I8hqJrf6HYSrKP1Y47F3pzOyAYSM7z6DbwqXsIsrPATVFRgR
ma75NyFTbjXt6OkCPKFH/at0TWX1RLvlPPT/pEUMJNOjXdkuw389JV/Jm1nQIuOwICOKYOrYZHWp
VTQrtcRIGsO7AgMBAAECggEBALQYHQGtMQ+b3HTM0ZOir0LP+KF2CvLEfSxrvQWUW3CBODNs8eQx
mS4amDYra2lYZUtlyZwd78/HJpkesgybQ487mzBTUDsm8dD/xR0e8mYh153o+PovZcfkVNnQxV+B
eHyHFtQQvD/loa9GfRp88cgxy85L0hDom6YzZK5TMH5RhtalPiX3bLCk6y3j2ZBqfDIzwt8ajnK8
H9/Ka5ICz0Qx1BFvVDig5GqGyH7+omRDWBMpmqPbr0RrCjj6whhlQpxZC4f/YePwy8LN9Q05n+1q
QxICYIw4XNntnu7doiE4uWPe1tW1tZRN+d+702WNlhhpqffO5uJjySjg+PK68pECgYEA8EvimOcH
sxGqkYQv5gR8rfeTdOUG9mOJgK8uoR5sDZdSpgrkgXW6mt3AiwjJr+6BtHN6QdHRUsA7HYXlmuJn
qONFCWMJCCRC4Ko6pxHDzRez6jclonNAGIh6DwY//6VLOvYOFq2xM7F8LTA++G5VfZbrU0uJyq1b
GfRgOj8QgakCgYEA7Ge9pEk5cWLthr8fSJOYsI5cOi/DjIPYhhXUZPGbti/7G/xs58a9Mcm2b+DE
90D+cElAgjAM8E8J0uWt5KO8fVq4fKuvVWvgvkmloqg+TPg7jM7voDd7JR8burOLiqvqQ0Cic4u9
hrMJM7XzKUQlLtVdWg1KVh1j/H9RLe9IAMMCgYEArKT44v5qS7/PmsksWMi0g5EzAnNiczfEnQ5A
JEZlP8aO/Pkqf9EEByx3n+zqa1qjGfE1z4BeMmQmlOmUs5ki/PZ8rWfYH19eJWhox4w972auPwLs
KTFAxd+YQp8s8BHkYTJToPueKxPDsfvN4lPzXE5IOQo2r8WphJZNZMvWojECgYAOl1SYKEDYY7+/
WlqG8z0wYIkGul36dUTO+dfzJwpyU0HPd2QNZjHVOdr9ysS9chCCQ7MsleSmjGpRzwVNoGGI5ymN
4FbhEdh8RjVn9bRqscOTLE6T9/is0N+4RU6uj2/VGM8uDIj1IGXIAEny2Rbmbhrl7P4SlJvQQNd0
21j5WwKBgQCbO0pumh5n/6dBP66FMsp2+v7pDFUO14yipDY0KiVRrsb7UdkdOxcQPrmf9flOfBaT
iAI8hu6PlEknb6nEw4+kYJN0rf4ENHaYhilDoJruLoPAtE9JkP0rEKNr7YfC/ZmmEFQitmHt7aoK
ThTTxQArD8YZ/5YLENp5ECxgWifPYA==
AES秘鑰Base64編碼:3aNZH0W9NAeFAJx66rf/Pw==
公鑰加密AES秘鑰并Base64編碼的結(jié)果:A17kkwTbz7p7UP6Z56cau3f0OoF+yZCngbJTQDUUsGwdj89alHIKg05tT7t4Nh8hq7l/1KkhNw6Y
RWiQ3LmoU55H82xzZWpj19YzqDCNyceIJKO7YafYI40uqiBrzSX9ruwrNMlv9AQi8RYKcXzX/89E
BJuSHSOttfgoXaEOmqgNDNAeipqMxHMCrqi4D6ST32WpttKlYm9NsxgqDuUfLrXQRoPusUfPk1ZI
N4mVvHX39n+WuOfMLjo2BGXddyDj8p6I3dD2v7OiLC5wiB6LYlB6yftX2xLdy077FpkJW6yyki2Y
O+mktov3ZSRflgBn5mjnGagJeqw5PXj4F3uo0w==
AES秘鑰加密實(shí)際的內(nèi)容并Base64編碼的結(jié)果:z307ajQDSY6zC9WyPMOZiUvPyRZWUbJv2k44Ee3/kiQ=
解密后的aesKey(Base64編碼): 3aNZH0W9NAeFAJx66rf/Pw==
解密后的實(shí)際內(nèi)容: hello, i am infi, good night!