AES算法: 我们通常是将一串明文通过AES加密成密文然后传递,接收方采用相同的方法解密进行使用,下面详细介绍使用方法、以及可能遇到的bug。
密匙:随机的字符串都可,但要注意长度要求为4、8、12、16等幂次增长,否则解密困难。
一、加密解密涉及的参数说明:
- key(密匙):自定义;
- 明 文 :要加密的值;
- IV :向量,偏移量;
- mode : 加密模式五种,EBC(不支持IV)、CBC、CFB、OFB、CTR,前两者常 用、后四种均支持IV;
- padding : 填充方式三种,PKCS5,、PKCS7(如果使用PKCS5报错,用PKCS7就可 以)、 NOPADDING
- 密文 :加密后的值;前端加密出来的就是base64格式的
二、结合react简单使用:
注:CryptoJS.enc.Utf8.parse 是用来从UTF8编码解析出原始字符串,以及配对的可以把字符串转成UTF8编码
转为加密需要的wordarray:let wordarray = CryptoJS.enc.Utf8.parse("****")
转为字符串:let utf8str = CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Utf8.stringify(decrypt))
1、npm 安装:npm install crypto-js
2、引入:import CryptoJS from 'crypto-js';
3、使用
//加密
encrypt(word){
var key = CryptoJS.enc.Utf8.parse("tion2077");//密钥与后端保持一致
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
//encrypted.toString() 就是base64格式的
return encodeURIComponent(encrypted.toString()); // (encodeURIComponent可以不要,根据自己的需求来)
}
//解密
decrypt(word){
let decodeurl = decodeURIComponent(word) //(对应上方的decodeURIComponent)
var key = CryptoJS.enc.Utf8.parse("tion2077");
var decrypt = CryptoJS.AES.decrypt(decodeurl, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
console.log('加密前:123'); //加密前:123
console.log('加密后:',this.encrypt(123)); //加密后:Qr1BDgw5JWOWySL8m4KTFQ%3D%3D
console.log('解密后:',this.decrypt(this.encrypt(123))); //解密后:123
三、相关拓展
1、加密后的数据直接转为字符串是Base64编码的: eg. encryteddata.toString()
这种解密的时候不需要btoa等base解码,如第二部分代码即可
2、转为java的密文应为(一般后端想要这种):
let encoded_str = encryteddata.ciphertext.toString()
这时解密就要将其先转为base64格式
第一步:let encryptedHexStr = CryptoJS.enc.Hex.parse(encoded_str) //先转为16进制
第二步:let encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHexStr) //转为base64
3、代码编写
//加密
encrypt(word){
var key = CryptoJS.enc.Utf8.parse("tion2077");//密钥与后端保持一致
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
//encrypted.toString() 就是base64格式的
return encodeURIComponent(encrypted.ciphertext.toString()); // (encodeURIComponent可以不要,根据自己的需求来)
}
//解密
decrypt(word){
let decodeurl = decodeURIComponent(word) //(对应上方的decodeURIComponent)
let encryptedHexStr = CryptoJS.enc.Hex.parse(decodeurl) //WordArray.init格式
//{sigBytes: 16,words: (4) [1119699214, 205071715, -1765203204, -1685941483]}
let encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHexStr) //Qr1BDgw5JWOWySL8m4KTFQ==
var key = CryptoJS.enc.Utf8.parse("tion2077");
var decrypt = CryptoJS.AES.decrypt(decodeurl, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
console.log('加密前:123'); //加密前:123
console.log('加密后:',this.encrypt(123)); //加密后:42bd410e0c39256396c922fc9b829315
console.log('解密后:',this.decrypt(this.encrypt(123)));//解密后:123