古詩詞大全網 - 藝術簽名 - 如何使用CryptoJS的AES方法進行加密和解密

如何使用CryptoJS的AES方法進行加密和解密

首先準備壹份明文和秘鑰:

var plaintText = 'aaaaaaaaaaaaaaaa'; // 明文

var keyStr = 'bbbbbbbbbbbbbbbb'; // 壹般key為壹個字符串

參看官網文檔,AES方法是支持AES-128、AES-192和AES-256的,加密過程中使用哪種加密方式取決於傳入key的類型,否則就會按照AES-256的方式加密。

CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.

由於Java就是按照128bit給的,但是由於是壹個字符串,需要先在前端將其轉為128bit的才行。

最開始以為使用CryptoJS.enc.Hex.parse就可以正確地將其轉為128bit的key。但是不然...

經過多次嘗試,需要使用CryptoJS.enc.Utf8.parse方法才可以將key轉為128bit的。好吧,既然說了是多次嘗試,那麽就不知道原因了,後期再對其進行更深入的研究。

// 字符串類型的key用之前需要用uft8先parse壹下才能用

var key = CryptoJS.enc.Utf8.parse(keyStr);

由於後端使用的是PKCS5Padding,但是在使用CryptoJS的時候發現根本沒有這個偏移,查詢後發現PKCS5Padding和PKCS7Padding是壹樣的東東,使用時默認就是按照PKCS7Padding進行偏移的。

// 加密

var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

由於CryptoJS生成的密文是壹個對象,如果直接將其轉為字符串是壹個Base64編碼過的,在encryptedData.ciphertext上的屬性轉為字符串才是後端需要的格式。

var encryptedBase64Str = encryptedData.toString();

// 輸出:'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=

console.log(encryptedBase64Str);

// 需要讀取encryptedData上的ciphertext.toString()才能拿到跟Java壹樣的密文

var encryptedStr = encryptedData.ciphertext.toString();

// 輸出:'44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06

console.log(encryptedStr);

由於加密後的密文為128位的字符串,那麽解密時,需要將其轉為Base64編碼的格式。

那麽就需要先使用方法CryptoJS.enc.Hex.parse轉為十六進制,再使用CryptoJS.enc.Base64.stringify將其變為Base64編碼的字符串,此時才可以傳入CryptoJS.AES.decrypt方法中對其進行解密。

// 拿到字符串類型的密文需要先將其用Hex方法parse壹下

var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr);

// 將密文轉為Base64的字符串

// 只有Base64類型的字符串密文才能對其進行解密

var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);

使用轉為Base64編碼後的字符串即可傳入CryptoJS.AES.decrypt方法中進行解密操作。

// 解密

var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

經過CryptoJS解密後,依然是壹個對象,將其變成明文就需要按照Utf8格式轉為字符串。

// 解密後,需要按照Utf8的方式將明文轉位字符串

var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);

console.log(decryptedStr); // 'aaaaaaaaaaaaaaaa'