描述:后端生成公钥对,给前端公钥,保留私钥,给前端的公钥加密用,后端保留的私钥解密用
1.java服务端生成公钥对,公钥给前端用作加密,私钥保留在后端用作解密,我生成的是1024位的公钥
2.加密最大的明文长度是117,解密最大长度是128,超长的话需要分段加解密,分段就是循环加解密,加密每个循环加密117字节,解密每个循环解密128个字节,117和128是根据1024得到的,网上很多说明
2.给前端的公钥需要先base64 编码且加上公钥头和尾如下
String publicKey
publicKey.add("-----BEGIN PUBLIC KEY-----\n");
publicKey.add(new String(Base64.encodeBase64((RSAPublicKey类型公钥).getEncoded())));
publicKey.add("\n-----END PUBLIC KEY-----");
jsencrypt 按照例程写就行
3.jsencrypt 使用:
npm install jsencrypt
import {JSEncrypt} from 'jsencrypt';
公钥加密js代码:
encrypt(str: String): any{
var jse = new JSEncrypt({default_key_size:1024});
jse.setPublicKey(java服务器传过来的公钥串);
var encrypted = jse.encrypt(str);
return encrypted;
}
注意:java默认的解密填充方式是pkcs1解密的时候不用改默认就行
注意:jsencrypt 加密后的内容是经过base64编码的,所以服务器解密的时候先base64解码并且注意前端传过来的String和byte[]类型之间的转换
java解密代码:
我这个解码程序也是根据网友博客略加改动,出处我忘记哪里了,如有问题请联系我及时删博
public String decryptByPrivate(String content) {
String decode = "";
cipher = Cipher.getInstance(ALGORITHM_RSA);
cipher.init(Cipher.DECRYPT_MODE, privateKey);//privateKey是RSAPrivateKey类型,即公钥对代码中的私钥
byte[] contentBytes = Base64.decodeBase64(content);
int splitLength = privateKey.getModulus().bitLength() / 8;//计算解密的最大长度
byte[][] arrays = splitBytes(contentBytes, splitLength);
StringBuffer stringBuffer = new StringBuffer();
for (byte[] array : arrays) {
stringBuffer.append(new String(cipher.doFinal(array)));
}
decode = stringBuffer.toString();
log.info("decryptCode : "+decode);
return decode;
}