JSEncrypt公钥加密后的密文长度过长,导致后端私钥解密的时候报错。javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
前端代码:
import JSEncrypt from 'jsencrypt'
export function rsaEncrypt(data,pubKey){
let encrypt=new JSEncrypt();
pubKey='-----BEGIN PUBLIC KEY-----\n' +
pubKey+'\n' +
'-----END PUBLIC KEY-----';
encrypt.setPublicKey(pubKey);
console.log('pubkey:'+pubKey)
console.log('data:'+data);
let content=encrypt.encrypt(data);
return content;
}
后端代码:
package org.xa.rbac.utils
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import javax.crypto.Cipher;
import java.io.IOException;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSAUtils {
//生成秘钥对
public static KeyPair getKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
return keyPair;
}
//获取公钥(Base64编码)
public static String getPublicKey(KeyPair keyPair){
PublicKey publicKey = keyPair.getPublic();
byte[] bytes = publicKey.getEncoded();
return byte2Base64(bytes);
}
//获取私钥(Base64编码)
public static String getPrivateKey(KeyPair keyPair){
PrivateKey privateKey = keyPair.getPrivate();
byte[] bytes = privateKey.getEncoded();
return byte2Base64(bytes);
}
//将Base64编码后的公钥转换成PublicKey对象
public static PublicKey string2PublicKey(String pubStr) throws Exception{
byte[] keyBytes = base642Byte(pubStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
//将Base64编码后的私钥转换成PrivateKey对象
public static PrivateKey string2PrivateKey(String priStr) throws Exception{
byte[] keyBytes = base642Byte(priStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
//公钥加密
public static byte[] publicEncrypt(byte[] content, PublicKey publicKey) throws Exception{
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] bytes = cipher.doFinal(content);
return bytes;
}
//私钥解密
public static byte[] privateDecrypt(byte[] content, PrivateKey privateKey) throws Exception{
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] bytes = cipher.doFinal(content);
return bytes;
}
//字节数组转Base64编码
public static String byte2Base64(byte[] bytes){
// BASE64Encoder encoder = new BASE64Encoder();
// return encoder.encode(bytes);
return new String(Base64.encodeBase64(bytes));
}
//Base64编码转字节数组
public static byte[] base642Byte(String base64Key) throws IOException {
BASE64Decoder decoder = new BASE64Decoder();
return decoder.decodeBuffer(base64Key);
}
}
公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMzRsiM1gFpmfDDGR4QTXaaZTAOBirZEIymxG9WguWvZjjmKQbYvt8Kjy58rNA9rfXvv407kOB38myVXafQBiGZDJmGsEUgLU5zYWxgwTatM7Ei+fbGOq6ZZGBlMOA3KMNPazP3FpCRoV1gd37j4wq1XJwo0JG4EULhPwYTWrsmwIDAQAB
长度:216bytes
私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMzNGyIzWAWmZ8MMZHhBNdpplMA4GKtkQjKbEb1aC5a9mOOYpBti+3wqPLnys0D2t9e+/jTuQ4HfybJVdp9AGIZkMmYawRSAtTnNhbGDBNq0zsSL59sY6rplkYGUw4Dcow09rM/cWkJGhXWB3fuPjCrVcnCjQkbgRQuE/BhNauybAgMBAAECgYEAjclCC794JRE7rPGbbRXYbsnBzgIIMkBLBDYPZgQ9GbNRceBvXPZ+HUwwlpvMNiGYzajQ3VxHKFcCkJBSe5YoY0N9vz/5LkQ49ctrKx/fBXwnL0LoKWO70iEK4mONx8AUwVQuRT7JvSbd4a7abUjdn4hecoAOmGd0jzPgP3jgbSECQQD/EdrHsUWC1FGf9+DRPmZ3dMAJ7xsunnaSwbDWO/bj8Hzm4vLClnFWX5fmaXEzB0ruo1jBDe5Je/waUmy6/kh/AkEAzYxReG797WKN7CTDylc5+KATNfwzeBHHNxpGERAytZMSd2zwaenBRZO0r37xqeRFfvU3/DKg0h0jI7WAAept5QJBANTcbZvg0IWR8lxxXGjCjnh6MhkYNbL+Ay4N/imK+UrX0yRLmRPSwNq4A+gBbrqLB3mHT/YsTgN9OLIuvxZ+RrkCQCf8TPj9tn4QdwViHYhmMYvRMAuHdUe9RaDNhqXZHdQ+uQ/sbFReOc/cLQEa08417uMEtxBjlO9q5aQTscQto5UCQGxJOqtga4V3ayKUMdG3SWd5HgYyOO/4WBS6YX+xWc5miVyMT7ZznXbx4AMeUCsJZMPQXPk7lWngDYL6RyLuh/M=
长度:848 bytes
明文:lisi
密文:QYT5FuL8c1AO09sacJrgRZZFtsF/3Lju8rx+Wt/Au595wHig5xG2KfyPMM4eGFr59tu7dxv6lfFZtPICCwlOxhyU7mJn+L9HmUUmIntDvRWjosCdoInOZ5jWl7MoYQWuKoljOMY4fVdwWH3BCbQp6/ZvUWyE3LiQ8oFzKB884r8=
长度:172bytes
报错信息:
022-01-08 23:54:58.018 ERROR 46664 --- [nio-8088-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes] with root cause
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344) ~[sunjce_provider.jar:1.8.0_60]
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) ~[sunjce_provider.jar:1.8.0_60]
at javax.crypto.Cipher.doFinal(Cipher.java:2165) ~[na:1.8.0_60]
at org.xa.rbac.utils.RSAUtils.privateDecrypt(RSAUtils.java:66) ~[classes/:na]
at org.xa.rbac.controller.LoginController.login(LoginController.java:83) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
lisi加密后为什么会有172bytes的密文,怎样解决这个报错
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。