import {Injectable} from '@angular/core';
import * as JsEncryptModule from 'jsencrypt';
@Injectable({
providedIn: 'root',
})
export class RsaService {
constructor(){}
public encrypt(data: string) {//data=JSON.stringify(Object) 将对象转为json字符串
const PublicKey= 'xxxxxx1024or2048';//公钥
let encryptor = new JsEncryptModule.JSEncrypt({});//使用该依赖来做rsa加密
encryptor.setPublicKey(PublicKey);//设置公钥
const blockSize = 117; // 1024 is 128byte need -11个byte//因为1024是128byte 需要减11个byte我也不知道为啥减。
let dataBlocks = [];//防止加密的字符串超出1024 ,进行字节分割
for (let i = 0; i < data.length; i += blockSize) {
const block = data.slice(i, i + blockSize);
const encryptedBlock = encryptor.encrypt(block);//对分割后的字节加密
dataBlocks.push(encryptedBlock);
}
const encryptedData = dataBlocks.join('');//最后组装到一起。 注意后台在解析的时候,要按照=号来分组解析,不然默认只解析第一组数据。
const res=btoa(data).replace(/=/g,'');//使用btoa函数对加密数据进行base64转换,(因为=号是补位字符,删除也没关系,所以可以删除。对数据进行进一步的加密)
return res;
}
}
//@RequestBody String param
byte[] strByte = Base64.getDecoder().decode(param);//将拿到的数据,base64解密
String encoderStr = new String(strByte);
String [] arrStr=encoderStr.split("=");//对解密数据 根据=分组
String objStr="";
if(arrStr.length>0){
for(int i=0;i<arrStr.length;i++){
objStr = objStr+ RSAUtil.privateDecrypt(arrStr[i], RSAUtil.getPrivateKey(privateKey));
}//将解析的数据字符串json拼接
Gson gson = new Gson();
AnyObject= gson.fromJson(objStr, AnyObject.class);//json转对象
}