我想使用共享密钥在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的工作。 –