原本的项目之前在接口传参的时候是有用了加密的,后面又有字段需要解密展示,原本的加密方法如下:
npm i crypto-js --save
import CryptoJS from 'crypto-js';
let key = 'xxxxxxxx'
let iv = 'xxxxxx'
export function getAES (originData) {
let data = CryptoJS.enc.Utf8.parse(originData);
let key = CryptoJS.enc.Utf8.parse(key);
let iv = CryptoJS.enc.Utf8.parse(iv);
let encrypted = CryptoJS.AES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString();
}
然后一开始后端还没部署,我就先拿了本地没加密的数据,自己先加密想着看看解密出来对不对
export function getDecryptAES(word) {
var decrypted = CryptoJS.AES.decrypt(word, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
});
return decrypted.toString(CryptoJS.enc.Utf8);
但是很奇怪,一直解密不出来,一开始一直以为是解密的方法有问题,试了很多种方法都不对,
摸不到头脑,然后在搜索文章的时候,看到有工具可以直接加密解密出结果,我就试了一下
诶,为什么加密结果和我的看起来不一样,虽然我是有加key和iv,但是感觉看起来就是不对呀
然后才发现原来我的加密是用ciphertext 是处理为16进制,而工具默认是加密成base64格式的,所以!
我要解密的话,我应该要把16进制先转换成base64的,再进行解密!思路瞬间打开!
export function getDecryptAES(word) {
var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
//上面两行就是将16进制转化为base64
var decrypted = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
});
return decrypted.toString(CryptoJS.enc.Utf8);
nice 啊 ~