使用CryptoJS在javascript中进行AES加密/解密
我正在尝试使用共享秘密在javascript和php之间发送AES加密消息。在Javascript中,我使用CryptoJS库。在php中,我使用mycrypt。我试图用javascript构建一条加密消息,然后用php使用共享密钥对其进行解密。我可以用Javascript加密和解密消息。我可以用php对同一条消息进行加密和解密,但两者之间的加密不同 Javascript使用CryptoJS在javascript中进行AES加密/解密,javascript,php,security,encryption,cryptography,Javascript,Php,Security,Encryption,Cryptography,我正在尝试使用共享秘密在javascript和php之间发送AES加密消息。在Javascript中,我使用CryptoJS库。在php中,我使用mycrypt。我试图用javascript构建一条加密消息,然后用php使用共享密钥对其进行解密。我可以用Javascript加密和解密消息。我可以用php对同一条消息进行加密和解密,但两者之间的加密不同 Javascript var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passph
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"
);
}
如果它们是一样的,那将是一场水晶灾难
但是:使用您使用PHP加密的方式(使用EBC模式),您将始终得到相同的结果。您可以通过查看位于的tux pciture了解这是一个问题的原因
CryptoJS似乎使用CBC作为默认的分组密码模式(至少他们在中这样说),该模式具有随机初始向量。这比CBC好
如果使用相同的密码、相同的分组密码模式(例如CBC)、相同的密钥和IV(当然还有相同的明文),则结果应该是相同的。注释表明也可能存在unicode问题
此外,MCRYPT_RIJNDAEL_256不是AES。AES的块大小为16字节-AES-128的密钥大小为16字节,AES-256的密钥大小为32字节。MCRYPT_RIJNDAEL_256的块大小为32字节,这是一个很大的区别
最后一点注意:加密数据是不够的!您还必须使用HMAC或GCM等经过身份验证的分组密码模式对其进行身份验证-如果不这样做,您可能至少会受到填充oracle攻击:php是ascii,js是unicode,因此即使字符串看起来具有相同的二进制模式,它们也不会,当你把这些零碎的东西混在一起时,差别就变得明显了。php可以使用unicode吗?php基本上不使用unicode。字符串只是一个字符的“字符串”(哈哈)。这些字符是1byte/char ascii还是utf16或utf8这样的多字节字符不是PHP的工作要弄清楚。非常好的参考资料,对我的学习非常有帮助。我决定使用GibberishAES,它有javascript和php库,两者协调得很好。