java实现RSA+AES的简单加密解密

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 {
 
    //测试RSA与AES的结合。
    //                  客户端用公钥加密AES秘钥,AES秘钥加密实际内容;
    //                  服务端用私钥解密AES秘钥,AES秘钥解密实际内容
    @Test
    public void testAesAndRsa() throws Exception {
        //===============生成公钥和私钥,公钥传给客户端,私钥服务端保留==================
        //生成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!  需要加密的实际内容
        String message = "hello, i am infi, good night!";
        //将Base64编码后的公钥转换成PublicKey对象
        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秘钥后的内容Base64编码
        String publicEncryptStr = RSAUtil.byte2Base64(publicEncrypt);
        System.out.println("公钥加密AES秘钥并Base64编码的结果:" + publicEncryptStr);
        
        //将Base64编码后的AES秘钥转换成SecretKey对象
        SecretKey aesKey = AESUtil.loadKeyAES(aesKeyStr);
        //用AES秘钥加密实际的内容
        byte[] encryptAES = AESUtil.encryptAES(message.getBytes(), aesKey);
        //AES秘钥加密后的内容Base64编码
        String encryptAESStr = AESUtil.byte2Base64(encryptAES);
        System.out.println("AES秘钥加密实际的内容并Base64编码的结果:" + encryptAESStr);
        
        
        //##############    网络上传输的内容有Base64编码后的公钥加密AES秘钥的结果 和 Base64编码后的AES秘钥加密实际内容的结果   #################
        //##############    即publicEncryptStr和encryptAESStr ###################
        
        
        //===================服务端================
        //将Base64编码后的私钥转换成PrivateKey对象
        PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr);
        //公钥加密AES秘钥后的内容(Base64编码),进行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秘钥转换成SecretKey对象
        SecretKey aesKey2 = AESUtil.loadKeyAES(aesKeyStr2);
        //AES秘钥加密后的内容(Base64编码),进行Base64解码
        byte[] encryptAES2 = AESUtil.base642Byte(encryptAESStr);
        //用AES秘钥解密实际的内容
        byte[] decryptAES = AESUtil.decryptAES(encryptAES2, aesKey2);
        //解密后的实际内容
        System.out.println("解密后的实际内容: " + new String(decryptAES));
        
    }
 
}

关于RSAUtil 和AESUtil这两个类,详见我的前面两篇博客《java实现RSA的简单加密解密》和 《java实现AES的简单加密解密》

运行结果如下:

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编码的结果:A17kkwTbz7p7UP6Z56cau3f0OoF+yZCngbJTQDUUsGwdj89alHIKg05tT7t4Nh8hq7l/1KkhNw6Y
RWiQ3LmoU55H82xzZWpj19YzqDCNyceIJKO7YafYI40uqiBrzSX9ruwrNMlv9AQi8RYKcXzX/89E
BJuSHSOttfgoXaEOmqgNDNAeipqMxHMCrqi4D6ST32WpttKlYm9NsxgqDuUfLrXQRoPusUfPk1ZI
N4mVvHX39n+WuOfMLjo2BGXddyDj8p6I3dD2v7OiLC5wiB6LYlB6yftX2xLdy077FpkJW6yyki2Y
O+mktov3ZSRflgBn5mjnGagJeqw5PXj4F3uo0w==
AES秘钥加密实际的内容并Base64编码的结果:z307ajQDSY6zC9WyPMOZiUvPyRZWUbJv2k44Ee3/kiQ=
解密后的aesKey(Base64编码): 3aNZH0W9NAeFAJx66rf/Pw==
解密后的实际内容: hello, i am infi, good night!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容