天天看點

CryptoJS中AES256(CBC)加密算法簡單使用

###1.CryptoJS腳本下載下傳

下載下傳位址:http://pan.baidu.com/s/1slwHVLb

CryptoJS中AES256(CBC)加密算法簡單使用

###2.WordArray (An array of 32-bit words.)

使用AES加密前,先了解下WordArray,我把它了解成CryptoJS中定義的 新的 資料類型,叫“單詞數組”。

2.1 : 初始化

var wordArray = CryptoJS.lib.WordArray.create();//建立一個空的 WordArray對象
           

2.2 : WordArray 對象 —>16進制字元串

var string = wordArray.toString();//預設CryptoJS.enc.Hex,即16進制字元串
 var string = wordArray.toString(CryptoJS.enc.Utf8);//utf-8字元串
           

2.3 : 16進制字元串 —>WordArray對象

var wordArray = CryptoJS.enc.Hex.parse(hexString);
           

2.4 : WordArray對象—>utf8字元串

var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
//等價于2.2中 wordArray.toString(CryptoJS.enc.Utf8);
           

2.5 : utf8字元串—>WordArray對象

var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
           

2.6 : WordArray對象—>Base64字元串

var base64String = CryptoJS.enc.Base64.stringify(wordArray);
           

2.7 : Base64字元串—>WordArray對象

var wordArray = CryptoJS.enc.Base64.parse(base64String);
           

###3.簡單使用

<script src="<%=request.getContextPath()%>/js/cryptojs/crypto-js.js"></script>
           
<script>
var message = "1_2_3_4_5_6_7_8_9_0";//utf8字元串,待加密

var iv = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);//随機生成長度為32的16進制字元串。IV稱為初始向量,不同的IV加密後的字元串是不同的,加密和解密需要相同的IV。

var key = "0321ebeba1f75de2d3cd3471af7418a4";//秘鑰。長度32的16進制字元串。
var cryptkey  = CryptoJS.enc.Hex.parse(key);//将16進制字元串轉換為 WordArray對象
//或者 
//var key = "qwertyuiopasdfgh";//長度16的utf8字元串
//var cryptkey =  CryptoJS.enc.Utf8.parse(key);//将utf8字元串轉換為 WordArray對象
//重點是 key要轉換為WordArray對象,加密時要用。

//測試
var ciphertext = aesEncrypt(message,cryptkey,iv);//加密
var decryptedMessage = aesDecrypt(ciphertext,cryptkey,iv);//解密
alert(decryptedMessage);//1_2_3_4_5_6_7_8_9_0
</script>
           
<script>
//** 加密 **
//var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
//params: 注意參數key為WordArray對象
//return: 密碼對象 或者 密碼對象Base64字元串
function aesEncrypt(message,key,iv){
	var ciphertext = CryptoJS.AES.encrypt(message, key, {	
		iv: CryptoJS.enc.Hex.parse(iv),
		mode: CryptoJS.mode.CBC,
		padding:CryptoJS.pad.Pkcs7 
 	});
	return ciphertext;//密碼對象(Obejct類型,非WordArray類型),Base64編碼。
	//return ciphertext.toString();//密碼對象的Base64字元串

}

//** 解密 **
//var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
//params: 注意參數ciphertext 必須為 Base64編碼的對象或者字元串。
function aesDecrypt(ciphertext,key,iv){
	var decrypted = CryptoJS.AES.decrypt(ciphertext,key,{ 
        iv: CryptoJS.enc.Hex.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7 
    });
	return decrypted.toString(CryptoJS.enc.Utf8);//WordArray對象轉utf8字元串
}

</script>
           

###4.延伸

AES加密函數 傳回值為 加密對象ciphertext,其屬性:

  • ciphertext: ciphertextWordArray,
               
  • key: keyWordArray,
               
  • iv: ivWordArray,
               
  • algorithm: CryptoJS.algo.AES,
               
  • mode: CryptoJS.mode.CBC,
               
  • padding: CryptoJS.pad.PKCS7,
               
  • blockSize: 4,
               
  • formatter: CryptoJS.format.OpenSSL
               

屬性ciphertext即 密文,可以發現,其為WordArray類型。通過 加密對象.屬性名 取值。

function aesEncrypt(message,key,iv){
	var ciphertext = CryptoJS.AES.encrypt(message, key, {	
		iv: CryptoJS.enc.Hex.parse(iv),
		mode: CryptoJS.mode.CBC,
		padding:CryptoJS.pad.Pkcs7 
 	});
	return CryptoJS.enc.Base64.stringify(ciphertext.ciphertext);//密文 轉 Base64字元串
}

//解密函數 稍有改動。
function aesDecrypt(crypted,key,iv){
	var decrypted = CryptoJS.AES.decrypt({ciphertext: CryptoJS.enc.Base64.parse(crypted)},key,{ 
        iv: CryptoJS.enc.Hex.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7 
    });
	return decrypted.toString(CryptoJS.enc.Utf8);
}
           

###4.總結

很多都是自己的了解,希望不會有大的偏差。最近這個項目,遇到了AES加密,才有所了解。真是路漫漫其修遠兮啊。。。

加密實戰:紫美雅和1、紫美雅和2

繼續閱讀