我想使用共享密鑰在JavaScript和PHP之間發送AES加密消息。在Javascript中,我使用CryptoJS庫。在PHP中,我正在使用mycrypt。我正在嘗試在JavaScript中構建加密消息,然後使用共享密鑰在php中對其進行解密。我可以在Javascript中加密和解密消息。我可以在php中加密和解密相同的消息 - 但兩者之間的加密不一樣。使用CryptoJS在JavaScript中的AES加密/解密
的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 is ascii and js是unicode,所以即使這些字符串看起來像是具有相同的二進制模式,但它們不會,並且當您混合這些位時,差異就會變得明顯。 PHP可以做unicode了嗎? – dandavis
php在unicode上基本沒有聲音。一個字符串只是一個「字符串」(哈)的字符。不管這些字符是1byte-per-char ascii還是多字節像utf16或utf8都不是PHP的工作。 –