Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CryptoJS在javascript中进行AES加密/解密_Javascript_Php_Security_Encryption_Cryptography - Fatal编程技术网

使用CryptoJS在javascript中进行AES加密/解密

使用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

我正在尝试使用共享秘密在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"
);
}

如果它们是一样的,那将是一场水晶灾难

但是:使用您使用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库,两者协调得很好。