![](/img/trans.png)
[英]AES encryption in php and then decryption with Javascript (cryptojs)
[英]AES encryption/decryption in javascript using CryptoJS
我正在嘗試使用共享密鑰在javascript和php之間發送AES加密消息。 在Javascript中,我正在使用CryptoJS庫。 在php中,我正在使用mycrypt。 我試圖在javascript中構造一個加密的消息,然后使用共享密鑰在php中對其解密。 我可以用Javascript加密和解密消息。 我可以在php中加密和解密相同的消息-但兩者之間的加密並不相同。
Javascript
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
alert(encrypted);
給
U2FsdGVkX18 + k3pba4l4MbGZfmDjMc1yQ6uj1fg + BGO =
在PHP中
<?php
$Pass = "Secret Passphrase";
$Clear = "Message";
$crypted = fnEncrypt($Clear, $Pass);
echo "Encrypted: ".$crypted."</br>";
$newClear = fnDecrypt($crypted, $Pass);
echo "Decrypted: ".$newClear."</br>";
function fnEncrypt($sValue, $sSecretKey) {
return rtrim(
base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$sSecretKey, $sValue,
MCRYPT_MODE_ECB,
mcrypt_create_iv(
mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_256,
MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
)
),"\0"
);
}
function fnDecrypt($sValue, $sSecretKey) {
return rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$sSecretKey,
base64_decode($sValue),
MCRYPT_MODE_ECB,
mcrypt_create_iv(
mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_256,
MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
),"\0"
);
}
輸出是
加密:iqJ0R5ahRP7GpWKtW7 + OBSCGnudDr99VbJC36OQlmgE =
解密:消息
我的問題是,為什么這些不一樣?
如果它們相同的話,將是低溫冷凍大地震。
但是:使用您的PHP加密方式(使用EBC模式),您將始終獲得相同的結果。 您可以在http://en.wikipedia.org/wiki/Cipher_block_chaining#Electronic_codebook_.28ECB.29上查看燕尾服的特性,以查看為什么這是一個問題。
CryptoJS似乎使用CBC作為默認的分組密碼模式(至少他們在https://code.google.com/p/crypto-js/#Block_Modes_and_Padding中這樣說),它具有一個隨機的初始向量。 這比CBC好。
結果應該是相同的,如果您使用相同的密碼,相同的分組密碼模式(例如CBC)以及相同的密鑰和IV(當然還有相同的純文本),則注釋表明也可能存在unicode問題。
此外,MCRYPT_RIJNDAEL_256不是AES。 AES的BLOCK大小為16字節-AES-128的KEY大小為16字節,AES-256的KEY大小為32字節。 MCRYPT_RIJNDAEL_256的BLOCK大小為32字節-差異很大。
最后一點:加密數據還不夠! 您還必須通過使用HMAC或使用經過身份驗證的塊密碼模式(例如GCM)對它進行身份驗證-如果不這樣做,則可能至少會遭受填充oracle攻擊: http : //en.wikipedia.org /維基/ Padding_oracle_attack
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.