当前位置: 首页 > 后端技术 > Java

RSASegmentalEncryption-Java

时间:2023-04-01 14:03:16 Java

前言RSA的密钥长度是1024,用公钥加密比较长的字符串会出现异常。这里介绍java中如何加密长文本,附上其他链接RSA加密-JavaRSA加密-VueRSA分段解密-Vue具体实现实现类importcom.alibaba.fastjson.JSONObject;importorg.apache.commons.lang3.ArrayUtils;importjavax.crypto.Cipher;导入java.io.ByteArrayOutputStream;导入java.net。URLDecoder;导入java.net.URLEncoder;导入java.security.KeyFactory;导入java.security.PrivateKey;导入java.security.PublicKey;导入java.security.spec.EncodedKeySpec;导入java.security.spec.PKCS8EncodedKeySpec;导入java...+aMBo8K3pK9BDD6XkM6N2Yfcva7BSFbUWuAcI7piXak0UKn9CElDuhNzUSgQn4IXKxIt3Iva5cV83qYumj+0yRjjLT8Muu1Y1rgBZjY9oBwhVoV+Twg25+UJ+6Q6HM4xTwQQwDoyQ私钥Apriy4jinalStringPRIVATE_KEY="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJpojgwHLCQKMimlmetqo3elutxlOr+3T5owGjwrekr0EMPpeQzo3Zh9y9rsFIVtRa4BwjumJdqTRQqf0ISUO6E3NRKBCfghcrEi3ci9rlxXzepi6aP7TJGOMtPwy67VjWuAFmNj2gHCFWhX5PCDbn5Qn7pDoczjFPBBAkOjLLiPAgMBAAECgYBnBBKhG7frY5IMDxwd4Euna767hB4qAlbte+JE+ozgrOzyiDXm0wXk0yjKqm8WhczTRwEbYsImjdKmP/GSQoN1AU7yEzM8j0Jgq46m9ZVrHhu2NpuZpr+XueWnA6FNz6tybBgcCwA4t8dvfbOrvjqhrCu01O1xWIpjronyFBN4IQJBAPGuF58xjXyANnp5YU8NhUQ73tTIveRlOpMXDSYkf9lWG26XIGUIsTe0f5jssiNmYtxG+lUm9LLfZgOLcrVkDZ0CQQCjjrBNMXub49efVTCg+nCGT2QXW2BHg/qs5vu8Y34LUHoD/hoEJ+AOWOdnhpRoYOpBwJAm3Gu4a1VmZGGafp0bAkAdfY3aWhSWtZpwNXF/UPoLCnc1Zc1uGkAchLqRBfEn1w7/3qcQTRA66OaNBYzzLuIvWOXhECDZ1tK+6fw0UCItAkAOLibW6n1fDKf7JnWq30u2OVfiNofoa2bmarhUowOgk3+grP0wcwyX8dlOPnrLeeuVe86DsASe3p9u2zEjJesVAkEAhkLiv4TXrC1QlJl7ghksUfFmdT7M4Zxlzj10ConMgq68HkLdmn2nNLsjhUHGwJe3EqM6aozn4zw/Z7uPIT9Fsw==";/***私钥分段加密*@paramcontent*@return*@throwsException*/publicstaticStringencryptLongByPrivateKey(Stringcontent)throwsException{//获取私钥PrivateKeyprivateKey=getPrivateKey(PRIVATE_KEY);密码cipher=Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,privateKey);//URLEncoder编码解决中文乱码问题byte[]data=URLEncoder.encode(content,"UTF-8").getBytes("UTF-8");//加密超过117字节会报错为此,采用分段加密方式加密byte[]enBytes=null;for(inti=0;i0){if(inputLen-offSet>128){cache=cipher.doFinal(data,offSet,128);}else{cache=cipher.doFinal(data,offSet,inputLen-offSet);}out.write(cache,0,cache.length);我++;偏移量=i*128;}byte[]decryptedData=out.toByteArray();关闭();返回URLDecoder.decode(newString(decryptedData,"UTF-8"));/***将base64编码的公钥字符串转换为PublicKey实例*@parampublicKey公钥*@returnPublicKey实例*@throwsException异常信息*/publicstaticPublicKeygetPublicKey(StringpublicKey)throwsException{EncodedKeySpeckeySpec=newX509EncodedKeySpec(Base64.getDecoder().decode(publicKey));KeyFactorykeyFactory=KeyFactory.getInstance("RSA");返回keyFactory.generatePublic(keySpec);}/***将base64编码的私钥字符串转换成PrivateKey实例*@paramprivateKey私钥*@returnPrivateKey实例*@throwsException异常信息*/privatestaticPrivateKeygetPrivateKey(StringprivateKey)抛出异常{byte[]keyBytes=Base64.getDecoder().decode(privateKey);PKCS8EncodedKeySpeckeySpec=newPKCS8EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance("RSATory");generatePrivate(keySpec);}publicstaticvoidmain(String[]args)throwsException{Mapmap=newHashMap<>();map.put("name","Cosini");map.put("电话","13888888888");字符串内容=JSONObject.toJSONString(地图);//密文字符串cipherText=RSAUtils.encryptLongByPrivateKey(content);System.out.println("密文:"+cipherText);//明文字符串plainText=RSAUtils.decryptLongByPublicKey(cipherText);System.out.println("纯文本:"+纯文本);}}结果如下:注:分段加密中文乱码是由于一个中文3字节,解密时最大长度分界为两段,转成String,会产生乱码。这里使用URLEncoder进行编码,解决中文乱码问题。来源GitHub:https://github.com/Maggieq8324/coisini-rsaGitee:https://gitee.com/maggieq8324/coisini-rsa$$-End-$$