前言 在前后端交互时,常常采取http方式进行传输,而明文传输通常会被网络抓包、反编译等手段得到htpp通讯接地址和参数等。 为了确保信息的安全,在生产中使用了很多种加密手段。最终采用AESRSA组合进行接口参数加密和解密的方式脱颖而出,成为了当今主流手段。为什么使用RSAAES混合加密1。加密介绍RSA加密:属于非对称加密,公钥用于对数据进行加密,私钥对数据进行解密,两者不可逆。公钥和私钥是同时生成的,且一一对应。比如:客户端拥有公钥,服务端拥有公钥和私钥。客户端将数据通过公钥进行加密后,发送密文给服务端,服务端可以通过私钥和公钥进行解密。AES加密:属于对称加密,简单点说就是,客户端用密码对数据进行AES加密后,服务端用同样的密码对密文进行AES解密。2。加密思路利用RSA来加密传输AES的密钥,用AES的密钥来加密数据。既利用了RSA的灵活性,可以随时改动AES的密钥;又利用了AES的高效性,可以高效传输数据。3。混合加密原因单纯的使用RSA(非对称加密)方式,效率会很低,因为非对称加密解密方式虽然很保险,但是过程复杂,耗费时间长,性能不高;RSA优势在于数据传输安全,且对于几个字节的数据,加密和解密时间基本可以忽略,所以用它非常适合加密AES秘钥(一般16个字节);单纯的使用AES(对称加密)方式的话,非常不安全。这种方式使用的密钥是一个固定的密钥,客户端和服务端是一样的,一旦密钥被人获取,那么,我们所发的每一条数据都会被都对方破解;AES有个很大的优点,那就是加密解密效率很高,而我们传输正文数据时,正好需要这种加解密效率高的,所以这种方式适合用于传输量大的数据内容;基于以上特点,就有了我们混合加密的思路时序图 代码实现RAS非对称加密javaAES加密packagecom。fandf。demo。encrypt;importorg。apache。commons。codec。binary。Base64;importorg。slf4j。Logger;importorg。slf4j。LoggerFactory;importjavax。crypto。Cipher;importjavax。crypto。KeyGenerator;importjavax。crypto。SecretKey;importjavax。crypto。spec。SecretKeySpec;功能:AES工具类SuppressWarnings(all)publicclassAESUtil{privatestaticfinalLoggerloggerLoggerFactory。getLogger(AESUtil。class);publicfinalstaticStringKEYALGORITHMSAES;publicfinalstaticintKEYSIZE128;生成AES密钥,base64编码格式(128)returnthrowsExceptionpublicstaticStringgetKeyAES128()throwsException{KeyGeneratorkeyGenKeyGenerator。getInstance(KEYALGORITHMS);keyGen。init(KEYSIZE);SecretKeykeykeyGen。generateKey();Stringbase64strBase64。encodeBase64String(key。getEncoded());returnbase64str;}生成AES密钥,base64编码格式(256)returnthrowsExceptionpublicstaticStringgetKeyAES256()throwsException{256需要换jar包暂时用128Stringbase64strgetKeyAES128();returnbase64str;}根据base64Key获取SecretKey对象parambase64KeyreturnpublicstaticSecretKeyloadKeyAES(Stringbase64Key){byte〔〕bytesBase64。decodeBase64(base64Key);SecretKeySpecsecretKeySpecnewSecretKeySpec(bytes,KEYALGORITHMS);returnsecretKeySpec;}AES加密字符串,SecretKey对象paramkeyparamencryptDataparamencodereturnpublicstaticStringencrypt(SecretKeykey,StringencryptData,Stringencode){try{finalCiphercipherCipher。getInstance(KEYALGORITHMS);cipher。init(Cipher。ENCRYPTMODE,key);byte〔〕encryptBytesencryptData。getBytes(encode);byte〔〕resultcipher。doFinal(encryptBytes);returnBase64。encodeBase64String(result);}catch(Exceptione){logger。error(加密异常:e。getMessage());returnnull;}}AES加密字符串,base64Key对象parambase64KeyparamencryptDataparamencodereturnpublicstaticStringencrypt(Stringbase64Key,StringencryptData,Stringencode){SecretKeykeyloadKeyAES(base64Key);try{finalCiphercipherCipher。getInstance(KEYALGORITHMS);cipher。init(Cipher。ENCRYPTMODE,key);byte〔〕encryptBytesencryptData。getBytes(encode);byte〔〕resultcipher。doFinal(encryptBytes);returnBase64。encodeBase64String(result);}catch(Exceptione){logger。error(加密异常:e。getMessage());returnnull;}}AES解密字符串,SecretKey对象paramkeyparamdecryptDataparamencodereturnpublicstaticStringdecrypt(SecretKeykey,StringdecryptData,Stringencode){try{finalCiphercipherCipher。getInstance(KEYALGORITHMS);cipher。init(Cipher。DECRYPTMODE,key);byte〔〕decryptBytesBase64。decodeBase64(decryptData);byte〔〕resultcipher。doFinal(decryptBytes);returnnewString(result,encode);}catch(Exceptione){logger。error(加密异常:e。getMessage());returnnull;}}AES解密字符串,base64Key对象parambase64KeyparamdecryptDataparamencodereturnpublicstaticStringdecrypt(Stringbase64Key,StringdecryptData,Stringencode){SecretKeykeyloadKeyAES(base64Key);try{finalCiphercipherCipher。getInstance(KEYALGORITHMS);cipher。init(Cipher。DECRYPTMODE,key);byte〔〕decryptBytesBase64。decodeBase64(decryptData);byte〔〕resultcipher。doFinal(decryptBytes);returnnewString(result,encode);}catch(Exceptione){logger。error(加密异常:e。getMessage());returnnull;}}}复制代码RSA加解密packagecom。fandf。demo。encrypt;importjava。nio。charset。StandardCharsets;importjava。security。Key;importjava。security。KeyFactory;importjava。security。KeyPair;importjava。security。KeyPairGenerator;importjava。security。PrivateKey;importjava。security。PublicKey;importjava。security。SecureRandom;importjava。security。Signature;importjava。security。interfaces。RSAPrivateKey;importjava。security。interfaces。RSAPublicKey;importjava。security。spec。PKCS8EncodedKeySpec;importjava。security。spec。X509EncodedKeySpec;importjava。util。HashMap;importjava。util。Map;importjavax。crypto。Cipher;importcom。alibaba。fastjson。JSON;importorg。apache。commons。codec。binary。Base64;importorg。apache。commons。lang3。ArrayUtils;importorg。slf4j。Logger;importorg。slf4j。LoggerFactory;SHA256withRSA工具类SuppressWarnings(all)publicclassRSAUtil{privatestaticfinalLoggerloggerLoggerFactory。getLogger(RSAUtil。class);MAXDECRYPTBLOCK应等于密钥长度8(1byte8bit),所以当密钥位数为2048时,最大解密长度应为256。128对应1024,256对应2048privatestaticfinalintKEYSIZE2048;RSA最大加密明文大小privatestaticfinalintMAXENCRYPTBLOCK117;RSA最大解密密文大小privatestaticfinalintMAXDECRYPTBLOCK128;不仅可以使用DSA算法,同样也可以使用RSA算法做数字签名privatestaticfinalStringKEYALGORITHMRSA;privatestaticfinalStringSIGNATUREALGORITHMSHA256withRSA;默认种子publicstaticfinalStringDEFAULTSEED()(ED47d784sde78;编码格式privatestaticfinalStringCODEFORMATEUTF8UTF8;RSA生成秘钥对生成密钥对:Base64转码的字符串paramkeyreturnpublicstaticMapString,StringinitKeyBase64Str()throwsException{MapString,StringmapnewHashMap(2);MapString,KeykeyMapinitKey();PublicKeypublicKey(PublicKey)keyMap。get(PublicKey);PrivateKeyprivateKey(PrivateKey)keyMap。get(PrivateKey);map。put(PublicKey,newString(Base64。encodeBase64(publicKey。getEncoded())));map。put(PrivateKey,newString(Base64。encodeBase64(privateKey。getEncoded())));logger。info(生成密钥JSON。toJSONString(map));returnmap;}生成默认密钥return密钥对象publicstaticMapString,KeyinitKey()throwsException{returninitKey(DEFAULTSEED);}生成密钥对:若seed为null,那么结果是随机的;若seed不为null且固定,那么结果也是固定的;paramseed种子return密钥对象publicstaticMapString,KeyinitKey(Stringseed)throwsException{KeyPairGeneratorkeygenKeyPairGenerator。getInstance(KEYALGORITHM);如果指定seed,那么secureRandom结果是一样的,所以生成的公私钥也永远不会变SecureRandomsecureRandomnewSecureRandom();secureRandom。setSeed(seed。getBytes());Modulussizemustrangefrom512to1024andbeamultipleof64keygen。initialize(KEYSIZE,secureRandom);生成一个密钥对,保存在keyPair中KeyPairkeyskeygen。genKeyPair();PublicKeypublicKeykeys。getPublic();PrivateKeyprivateKeykeys。getPrivate();将公钥和私钥保存到MapMapString,KeymapnewHashMap(2);map。put(PublicKey,publicKey);map。put(PrivateKey,privateKey);logger。info(生成密钥JSON。toJSONString(map));returnmap;}RSA加密、解密获取公钥PublicKey信息param公钥returnpublicstaticPublicKeygetPublicKey(StringpubKeyStr)throwsException{byte〔〕publicKeysBase64。decodeBase64(pubKeyStr);X509EncodedKeySpecpublicKeySpecnewX509EncodedKeySpec(publicKeys);KeyFactorymykeyFactoryKeyFactory。getInstance(KEYALGORITHM);PublicKeypublicKeymykeyFactory。generatePublic(publicKeySpec);logger。info(传入的公钥为:【pubKeyStr】,转义后的公钥为:【publicKey】);returnpublicKey;}公钥加密,指定RSA方式的PublicKey对象paramstr加密字符串parampublicKey公钥returnpublicstaticStringencrypt(Stringstr,StringpublicKey)throwsException{base64编码的公钥byte〔〕decodedBase64。decodeBase64(publicKey);RSAPublicKeypubKey(RSAPublicKey)KeyFactory。getInstance(KEYALGORITHM)。generatePublic(newX509EncodedKeySpec(decoded));RSA加密CiphercipherCipher。getInstance(KEYALGORITHM);cipher。init(Cipher。ENCRYPTMODE,pubKey);StringoutStrBase64。encodeBase64String(cipher。doFinal(str。getBytes(CODEFORMATEUTF8)));returnoutStr;}公钥加密,任意PublicKey对象parampublicKeyparamencryptDataparamencodepublicstaticStringencrypt(PublicKeypublicKey,StringencryptData,Stringencode)throwsException{if(publicKeynull){thrownewException(加密公钥为空,请设置。);}try{finalCiphercipherCipher。getInstance(KEYALGORITHM);cipher。init(Cipher。ENCRYPTMODE,publicKey);byte〔〕outputcipher。doFinal(encryptData。getBytes(encode));returnBase64。encodeBase64String(output);}catch(Exceptione){logger。info(加密异常:e。getMessage());returnnull;}}私钥解密,指定RSA方式的PrivateKey对象paramstr加密字符串paramprivateKey私钥returnpublicstaticStringdecrypt(Stringstr,StringprivateKey)throwsException{64位解码加密后的字符串byte〔〕inputByteBase64。decodeBase64(str。getBytes(CODEFORMATEUTF8));base64编码的私钥byte〔〕decodedBase64。decodeBase64(privateKey);RSAPrivateKeypriKey(RSAPrivateKey)KeyFactory。getInstance(KEYALGORITHM)。generatePrivate(newPKCS8EncodedKeySpec(decoded));RSA解密CiphercipherCipher。getInstance(KEYALGORITHM);cipher。init(Cipher。DECRYPTMODE,priKey);StringoutStrnewString(cipher。doFinal(inputByte));returnoutStr;}RSA公钥加密,【限制长度】paramstr加密字符串parampublicKey公钥return密文publicstaticStringencryptByPublicKey(Stringstr,StringpublicKey)throwsException{base64编码的公钥byte〔〕keyBytesdecryptBASE64(publicKey);RSAPublicKeypubKey(RSAPublicKey)KeyFactory。getInstance(KEYALGORITHM)。generatePublic(newX509EncodedKeySpec(keyBytes));RSA加密CiphercipherCipher。getInstance(KEYALGORITHM);cipher。init(Cipher。ENCRYPTMODE,pubKey);byte〔〕datastr。getBytes(UTF8);加密时超过117字节就报错。为此采用分段加密的办法来加密byte〔〕enBytesnull;for(inti0;idata。length;iMAXENCRYPTBLOCK){注意要使用2的倍数,否则会出现加密后的内容再解密时为乱码byte〔〕doFinalcipher。doFinal(ArrayUtils。subarray(data,i,iMAXENCRYPTBLOCK));enBytesArrayUtils。addAll(enBytes,doFinal);}StringoutStrencryptBASE64(enBytes);returnoutStr;}RSA私钥解密,【限制长度】paramencryStr加密字符串paramprivateKey私钥return明文publicstaticStringdecryptByPrivateKey(StringencryStr,StringprivateKey)throwsException{base64编码的私钥byte〔〕decodeddecryptBASE64(privateKey);RSAPrivateKeypriKey(RSAPrivateKey)KeyFactory。getInstance(KEYALGORITHM)。generatePrivate(newPKCS8EncodedKeySpec(decoded));RSA解密CiphercipherCipher。getInstance(KEYALGORITHM);cipher。init(Cipher。DECRYPTMODE,priKey);64位解码加密后的字符串byte〔〕datadecryptBASE64(encryStr);解密时超过128字节报错。为此采用分段解密的办法来解密StringBuildersbnewStringBuilder();for(inti0;idata。length;iMAXDECRYPTBLOCK){byte〔〕doFinalcipher。doFinal(ArrayUtils。subarray(data,i,iMAXDECRYPTBLOCK));sb。append(newString(doFinal));}returnsb。toString();}BASE64Encoder加密paramdata要加密的数据return加密后的字符串privatestaticStringencryptBASE64(byte〔〕data){returnnewString(Base64。encodeBase64(data));}BASE64Encoder解密paramdata要解密的数据return解密后的字节privatestaticbyte〔〕decryptBASE64(Stringdata){returnBase64。decodeBase64(data);}SIGN签名,验签加签:生成报文签名paramcontent报文内容paramprivateKey私钥paramencode编码returnpublicstaticStringdoSign(Stringcontent,StringprivateKey,Stringencode){try{StringunsignBase64。encodeBase64String(content。getBytes(StandardCharsets。UTF8));byte〔〕privateKeysBase64。decodeBase64(privateKey。getBytes());PKCS8EncodedKeySpecprivateKeySpecnewPKCS8EncodedKeySpec(privateKeys);KeyFactorymykeyFactoryKeyFactory。getInstance(KEYALGORITHM);PrivateKeypsbcPrivateKeymykeyFactory。generatePrivate(privateKeySpec);SignaturesignatureSignature。getInstance(SIGNATUREALGORITHM);signature。initSign(psbcPrivateKey);signature。update(unsign。getBytes(encode));byte〔〕signedsignature。sign();returnBase64。encodeBase64String(signed);}catch(Exceptione){logger。error(生成报文签名出现异常);}returnnull;}验证:验证签名信息paramcontent签名报文paramsigned签名信息parampublicKey公钥paramencode编码格式returnpublicstaticbooleandoCheck(Stringcontent,Stringsigned,PublicKeypublicKey,Stringencode){try{解密之前先把content明文,进行base64转码StringunsignedBase64。encodeBase64String(content。getBytes(encode));SignaturesignatureSignature。getInstance(SIGNATUREALGORITHM);signature。initVerify(publicKey);signature。update(unsigned。getBytes(encode));booleanbverifysignature。verify(Base64。decodeBase64(signed));returnbverify;}catch(Exceptione){logger。error(报文验证签名出现异常);}returnfalse;}}复制代码测试类packagecom。fandf。demo。encrypt;importorg。apache。commons。codec。binary。Base64;importjavax。crypto。KeyGenerator;importjavax。crypto。SecretKey;importjava。security。KeyPair;importjava。security。KeyPairGenerator;importjava。security。NoSuchAlgorithmException;importjava。security。SecureRandom;importjava。security。interfaces。RSAPrivateKey;importjava。security。interfaces。RSAPublicKey;importjava。util。HashMap;importjava。util。Map;authorfandongfengpublicclassTest{publicstaticvoidmain(String〔〕args){StringsendMesg天王盖地虎,小鸡炖蘑菇;System。out。println(需要加密传输的数据(sendMesg)为:sendMesg);用于封装RSA随机产生的公钥与私钥MapInteger,StringkeyMapnewHashMapInteger,String();AES:随机生成加密秘钥KeyGeneratorkeyGennull;try{keyGenKeyGenerator。getInstance(AES);keyGen。init(128);}catch(NoSuchAlgorithmExceptione){e。printStackTrace();}SecretKeykeykeyGen。generateKey();StringAESKeyStrBase64。encodeBase64String(key。getEncoded());System。out。println(随机生成的AES加密秘钥(AESKeyStr)为:AESKeyStr);RSA:生成公钥和私钥KeyPairGeneratorkeyPairGennull;try{keyPairGenKeyPairGenerator。getInstance(RSA);}catch(NoSuchAlgorithmExceptione){e。printStackTrace();}初始化密钥对生成器,指定位数,不指定种子keyPairGen。initialize(2048,newSecureRandom());生成一个密钥对,保存在keyPair中KeyPairkeyPairkeyPairGen。generateKeyPair();得到RSA私钥RSAPrivateKeyprivateKey(RSAPrivateKey)keyPair。getPrivate();得到RSA公钥RSAPublicKeypublicKey(RSAPublicKey)keyPair。getPublic();得到公钥字符串StringpublicKeyStrnewString(Base64。encodeBase64(publicKey。getEncoded()));System。out。println(随机生成的公钥(publicKey)为:publicKeyStr);得到私钥字符串StringprivateKeyStrnewString(Base64。encodeBase64((privateKey。getEncoded())));System。out。println(随机生成的私钥(privateKey)为:privateKeyStr);1。客户端:AES秘钥key加密数据StringencryptDataAESUtil。encrypt(AESKeyStr,sendMesg,UTF8);System。out。println(AES秘钥key加密后的字符串为:encryptData);2。客户端:RSA公钥加密AES秘钥key(keyEn)StringencryptKeynull;try{encryptKeyRSAUtil。encrypt(AESKeyStr,publicKeyStr);System。out。println(RSA加密后的AES秘钥key为:encryptKey);}catch(Exceptione){e。printStackTrace();}System。out。println(客户端将AES秘钥key加密后的数据和RSA加密后的AES秘钥发送给服务端);System。out。println(服务端收到数据,开始工作);3。服务端:RSA私钥解密AES秘钥key(keyEn)Stringaeskeynull;try{aeskeyRSAUtil。decrypt(encryptKey,privateKeyStr);System。out。println(服务端,RSA解密后的AES秘钥key为:aeskey);}catch(Exceptione){e。printStackTrace();}4。服务端:AES秘钥key解密数据StringdataAESUtil。decrypt(aeskey,encryptData,UTF8);System。out。println(服务端,AES秘钥key解密后的字符串为:data);}}打印输出结果需要加密传输的数据(sendMesg)为:天王盖地虎,小鸡炖蘑菇随机生成的AES加密秘钥(AESKeyStr)为:8SPp19W8gsZ6jpP8r89cg随机生成的公钥(publicKey)为:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoRgrQGG0MwxebDpHLhGhcdBM1HS0Z8DYE8zXsU9Y0IWPou2ht3qYSoJPJWDDoGvjRdtjb7HyPijEpquWYocbufG7gfhn0BWrjmR08TgS3FfmIRHkGAlNKcZmEqe670SjMlkMIlILye7dT3jdjcP1kkf9IRfAtfBC7Pk40KXG3zwBGe8EgT3xEEPM551A6K1KYO9Ocgvb5NI1xBwMKNIu6hZ9dqJHMlbKMtwh7S74LrhROMSnZkX5pvyHmRhWjn7i14nTKWealhYmIHAVpz7InEGnEPqHjWUTFAM1F9N4gaJs8TIObSfeF2BtStcFBNssCgyQIDAQAB随机生成的私钥(privateKey)为:MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQChGCtAYbQzDF5sOkcuEaFx0EzUdLRn7wNgTzNexT1jQhYi7aG3ephKgk8lYMOgaP5F362NvsfIKMSmq5Zihxu58buBGfQFauP6ZHTxOBLcVYhEeQYCU0pxmYSp7rvRKMyWQwiUgvJ7t1PeN2NwWSR0hF8C18ELs6TjQpcbfPAEZ7wTBPfEQQ8znnX8DorUpg705yC9vk0jXEHAwo0j67qFn12okcyVsoy3CHtLvgvuH5E4xKdnRfmmIeZGFaOfuLXidMpb95qX6FiYgcD5WnPsicQacQ6oeNZRMUAzUX03iBomzxMg5tJ94XYG35K39wUE2ywKDL5AgMBAAECggEBAIVE4lsjuRjWLbMpT0OMcFwgr76QZQOBmQBgYTwdYWM4awilwDhy4lQZk3Jfp9cqCnJCfqAtwfgUDtJyqfHw0pqsVcdvvhzbg2hTTMTMi9wbSHUbKgA2vjHgPmTwE1448X4E7BnikyaPBIfKvHWLp0F89JYN6ksNeTCTrZjsY2OwrvCurcLYPZncVXJxk3cp09kd66MFtmeoAWKrv5IyheqAV9j62md3fRBJRyMEnmawje0HaP0k5AiyuAOedunolcA5EUyT5Drunnb2xLdhFBheMRflL2bEMzkOK3rdCMvdJlpqeojrohiyWi6iiC3KmzBnbiLNH6m0MSS89ECgYEA10CEYlIMyMUi2cIPi6s116lDHyj9P4G93uqaL5TGLJrKy5aQyIuR1h4TnpjsKYUgiR4vb1N86uSHt8tAC45U3laVkvmEgZAWJT9GoSWzuyDtAfzETbzkAQuWFWM7VDW5Utj0YUu1OOZGowj47zBk8shWdlcbfIUspaGxL0CgYEAv5cUuWlJFhHHpO8cTEgTZAucin9vbR6fyuqiaqd7j5JEsFqKVNlpyDrH7vBfA8vtQrGSq8dvS8LAgqOUMrRVPkYO1DgO0a6wHahat8DxLvcTDjAV1XauWwLiX3QWSEkkyofA2Uf5WmapNhrnAAxmAxUoKvomOhdCdUO0CgYAXl5Oq7xFFpA24zkND7KTGScpMCXpov7gf0aPUkiGa9Z0gvWX6gfG7w75cAtaVaQGQ0xpPXpDNkvNNC1M4lrwROtwzlZtgAnXvMP0IENfoNbl2ewmYZn8uwlNfYYImZ7RTMQkMdcQAHVBGsEIQfT5jOb4Qn3ZvQL8eGUXBQKBgQCNvlLA0doWj9Tqe1SuQuzFqamI9ccmLK4sA7xJ2Ya6Si55x9nTH2lScsvLf3ZEtDY2DiSjRl8KTJ4FHksAlUUJkKireYur8KW8uytJG7pX7QBY9x631bzlA0WStg27YpmtGaZyFGu7wbWEPnDY6ffa0zVnwN2uFcrxyWN6CQKBgQCDN3m0JB0TjSCPRrBkiyiHACvmFRQW2z5YzOJpJI839XdEDX0AHWbGLkgNmrfJfptSOuxQSzreQNMcHNexvvfLnYwstKuIc16w8hR9D0payxosh78vLDihbql5RMEhyUUhnyU24llqR6nChSTFDPFJXaaDgtUGJ0EF7agAES秘钥key加密后的字符串为:e7xA6cCYjSgaYq5LyCIdwghUyLocH7hvaHuR3T6laIkf45LXF80Ectj6YSXrOdRSA加密后的AES秘钥key为:BLFFlz5CoNKOCUfOK9BD6b7fY8jHkm97gRv34kCjiPyPW1bY6p2pWB3H1h37O2vUyrXlfOUuNQUKZomjnng4ggmkCmZ49gdDRkSo3DycXy4tU16r3hTWIoXQxtE9oKOy7QO6aIvYT6jjnq6ULzCUiZ0mB541GMlkU2WFnIiDIK0T45H2exlv4NJcT7sW9Lmy6L43laWgfSW65ud7ixfP2ST7NfTt6zIGQD1198Pqx1woUg6lK4FY0MXKz9NTUxWJcHoOsaPREQABsHRgyjM2WFIYD34h7TZVSrmCP7XCJoENFpZyaqjahjXLJBbmOfMDHxg00PLA客户端将AES秘钥key加密后的数据和RSA加密后的AES秘钥发送给服务端服务端收到数据,开始工作服务端,RSA解密后的AES秘钥key为:8SPp19W8gsZ6jpP8r89cg服务端,AES秘钥key解密后的字符串为:天王盖地虎,小鸡炖蘑菇复制代码