Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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
Javascript AES加密中的CryptoJS额外参数。如何使用PHP进行复制?_Javascript_Php_Encryption_Aes_Cryptojs - Fatal编程技术网

Javascript AES加密中的CryptoJS额外参数。如何使用PHP进行复制?

Javascript AES加密中的CryptoJS额外参数。如何使用PHP进行复制?,javascript,php,encryption,aes,cryptojs,Javascript,Php,Encryption,Aes,Cryptojs,我试图用PHP 5.4.4复制以下CryptoJS 3.1.2代码: var plaintext = 'test'; var key = CryptoJS.enc.Utf8.parse('9rIY8vV8DdOKx3m6JocjEaObhhYc2NfY'); var iv = CryptoJS.enc.Utf8.parse('r0dkbnVQhklNeUGA'); var encrypted = CryptoJS.AES.encrypt(plaintext, 'euhe68vjdr1aX4F09

我试图用PHP 5.4.4复制以下CryptoJS 3.1.2代码:

var plaintext = 'test';
var key = CryptoJS.enc.Utf8.parse('9rIY8vV8DdOKx3m6JocjEaObhhYc2NfY');
var iv = CryptoJS.enc.Utf8.parse('r0dkbnVQhklNeUGA');
var encrypted = CryptoJS.AES.encrypt(plaintext, 'euhe68vjdr1aX4F091c7aCggSMBf0A7M', key,{iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});
我已经找到了几个关于这个问题的问题,但是在
明文
密钥
之间的
encrypt()
中没有一个有额外的参数

CryptoJS wiki根本没有提到这个参数。 然而,它是有效的。我可以用这个来解密:

var decrypted = CryptoJS.AES.decrypt(encrypted, 'euhe68vjdr1aX4F091c7aCggSMBf0A7M', key, {iv: iv});
如果我在
decrypt()
调用中省略了
'euhe68vjdr1aX4F091c7aCggSMBf0A7M'
,它将不起作用。 所以这个参数确实起了作用。但是什么呢?这是一种杂烩,一种盐吗

有人知道我如何用PHP复制这个特定的加密过程吗

我不能以任何方式修改这个JS代码。 该代码位于登录页面上,用于在将凭据发送到服务器之前对其进行加密

我正试图使用PHP cURL从命令行向该服务器提交凭据,这就是为什么我需要重现这个加密过程

更新:感谢Jim的回答,我现在有了正确的JavaScript,现在我需要帮助在PHP中复制代码

以下是JS:

var plaintext = 'test';
var key = 'euhe68vjdr1aX4F091c7aCggSMBf0A7M';
var iv = CryptoJS.enc.Utf8.parse('r0dkbnVQhklNeUGA');
var encrypted = CryptoJS.AES.encrypt(plaintext, key, key,{iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7})
加密
等于
U2FsdGVkX1+ZujoXKqDHcO+4N1QO+Nv1KHUMFjZos1s=

以下是解密:

var decrypted = CryptoJS.AES.decrypt(encrypted, key);
解密
等于
测试

我已经尝试了许多不同的方法来用PHP复制加密,但是没有一种方法给出一个字符串,我可以用上面的JS来解码

例如,使用,我尝试了以下代码:

$key = 'euhe68vjdr1aX4F091c7aCggSMBf0A7M';
$iv =  'r0dkbnVQhklNeUGA';
$message = 'test';
$AES              = new AES_Encryption($key, $iv, PKCS7);
$encrypted        = $AES->encrypt($message);
$decrypted        = $AES->decrypt($encrypted);
$base64_encrypted = base64_encode('Salted__'.$encrypted);
我以
U2FsdGVkX18eEv+TnigBEKGJL8t/V1Hm而不是
U2FsdGVkX1+ZujoXKqDHcO+4N1QO+Nv1KHUMFjZos1s=
请注意,由于我添加了“Salted_u u;”前缀,这两个字符串的开头相同(因为CryptoJS似乎做了相同的事情)

我用phpseclib、openssl\u encrypt和mcrypt尝试了类似的代码。不走运

任何暗示都将不胜感激

**更新:已修复**

此PHP代码与上面的CryptoJS代码完美匹配

function ssl_encrypt($pass, $data)
{
    // Set a random salt
    $salt = substr(md5(mt_rand(), true), 8);

    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = $block - (strlen($data) % $block);

    $data = $data . str_repeat(chr($pad), $pad);

    // Setup encryption parameters
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, "", MCRYPT_MODE_CBC, "");

    $key_len =  mcrypt_enc_get_key_size($td);
    $iv_len =  mcrypt_enc_get_iv_size($td);

    $total_len = $key_len + $iv_len;
    $salted = '';
    $dx = '';
    // Salt the key and iv
    while (strlen($salted) < $total_len) {
        $dx = md5($dx.$pass.$salt, true);
        $salted .= $dx;
    }
    $key = substr($salted,0,$key_len);
    $iv = substr($salted,$key_len,$iv_len);

    mcrypt_generic_init($td, $key, $iv);
    $encrypted_data = mcrypt_generic($td, $data);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    //return chunk_split(base64_encode('Salted__' . $salt . $encrypted_data),32,"\r\n");
    return base64_encode('Salted__' . $salt . $encrypted_data);
}

function ssl_decrypt($password, $edata)
{
    $data = base64_decode($edata);
    print "Data: " . $data . "\n";

    $salt = substr($data, 8, 8);
    print "Salt (Base64): " . base64_encode($salt) . "\n";

    $ct = substr($data, 16);
    print "Content (Base64): " . base64_encode($ct) . "\n";

    $rounds = 3;
    $data00 = $password.$salt;

    print "Data00 (Base64): " . base64_encode($data00) . "\n";

    $md5_hash = array();
    $md5_hash[0] = md5($data00, true);

    $result = $md5_hash[0];
    print "MD5-Hash[0] (Base64): " . base64_encode($result) . "\n";
    for ($i = 1; $i < $rounds; $i++) {
        $md5_hash[$i] = md5($md5_hash[$i - 1].$data00, true);
        $result .= $md5_hash[$i];
        print "Result (Base64): " . base64_encode($result) . "\n";
    }

    $key = substr($result, 0, 32);
    print "Key (Base64): " . base64_encode($key) . "\n";
    $iv = substr($result, 32, 16);
    print "IV (Base64): " . base64_encode($iv) . "\n";

    print "Decrypted: " . openssl_decrypt($ct, 'aes-256-cbc', $key, true, $iv) . "\n";
}

$encryptedString = ssl_encrypt('euhe68vjdr1aX4F091c7aCggSMBf0A7M', 'test');
$decryptedString = ssl_decrypt('euhe68vjdr1aX4F091c7aCggSMBf0A7M', $encryptedString);
函数ssl\u加密($pass,$data)
{
//随意放盐
$salt=substr(md5(mt_rand(),true),8);
$block=mcrypt\u get\u block\u size(mcrypt\u RIJNDAEL\u 128,mcrypt\u MODE\u CBC);
$pad=$block-(strlen($data)%$block);
$data=$data.stru重复(chr($pad),$pad);
//设置加密参数
$td=mcrypt_模块打开(mcrypt_RIJNDAEL_128,“,mcrypt_模式CBC,”;
$key\u len=mcrypt\u enc\u get\u key\u size($td);
$iv_len=mcrypt_enc_get_iv_size($td);
$total_len=$key_len+$iv_len;
$salted='';
$dx='';
//在钥匙上撒盐
而(strlen($salted)<$total_len){
$dx=md5($dx.$pass.$salt,true);
$salted.=$dx;
}
$key=substr($salted,0,$key_len);
$iv=substr($salt,$key_len,$iv_len);
mcrypt_generic_init($td,$key,$iv);
$encrypted_data=mcrypt_generic$td$data;
mcrypt_generic_deinit($td);
mcrypt模块关闭($td);
//返回chunk_split(base64_encode('Salted_.$salt.$encrypted_data),32,“\r\n”);
返回base64_编码('Salted_.$salt.$encrypted_数据);
}
函数ssl_decrypt($password,$edata)
{
$data=base64_解码($edata);
打印“数据:.$Data.”\n;
$salt=substr($data,8,8);
打印“Salt(Base64):”.Base64\u编码($Salt)。“\n”;
$ct=substr($data,16);
打印“内容(Base64):”.Base64\u编码($ct)。“\n”;
$rounds=3;
$data00=$password.$salt;
打印“Data00(Base64):”.Base64\u编码($Data00)。“\n”;
$md5_hash=array();
$md5_hash[0]=md5($data00,true);
$result=$md5_散列[0];
打印“MD5哈希[0](Base64):”.Base64\u编码($result)。“\n”;
对于($i=1;$i<$rounds;$i++){
$md5_散列[$i]=md5($md5_散列[$i-1].$data00,true);
$result.=$md5_散列[$i];
打印“结果(Base64):”.Base64\u编码($Result)。“\n”;
}
$key=substr($result,0,32);
打印“密钥(Base64):”.Base64\u编码($Key)。“\n”;
$iv=子项($result,32,16);
打印“IV(Base64):”.Base64\u编码($IV)。“\n”;
打印“解密:”.openssl_decrypt($ct,'aes-256-cbc',$key,true,$iv)。“\n”;
}
$encryptedString=ssl_encrypt('euhe68vjdr1aX4F091c7aCggSMBf0A7M','test');
$decryptedString=ssl_decrypt($euhe68vjdr1aX4F091c7aCggSMBf0A7M',$encryptedString);

我不记得在哪里找到的。抱歉。

这是JavaScript的东西,不是CryptoJS的东西。试试这个:

var decrypted = CryptoJS.AES.decrypt(encrypted, 'euhe68vjdr1aX4F091c7aCggSMBf0A7M', {iv: iv});
或者这个:

key = 'euhe68vjdr1aX4F091c7aCggSMBf0A7M';
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv});
你会发现你认为是关键的东西,根本不是关键。它正在与末尾的可选参数分组,并将丢失


“euhe68vjdr1aX4F091c7aCggSMBf0A7M”是您的密钥,或者是您的密钥的来源。

这是一种JavaScript内容,而不是CryptoJS内容。试试这个:

var decrypted = CryptoJS.AES.decrypt(encrypted, 'euhe68vjdr1aX4F091c7aCggSMBf0A7M', {iv: iv});
或者这个:

key = 'euhe68vjdr1aX4F091c7aCggSMBf0A7M';
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv});
你会发现你认为是关键的东西,根本不是关键。它正在与末尾的可选参数分组,并将丢失


“euhe68vjdr1aX4F091c7aCggSMBf0A7M”是您的密钥,或者是您的密钥的派生源。

您可以使用`字符来表示内联代码片段。要匹配PHP,您不能使用字符串作为密钥,必须使用单词数组。尝试var key=CryptoJS.enc.Utf8.parse('euhe68vjdr1aX4F091c7aCggSMBf0A7M')。否则CryptJS就像从密码短语派生密钥一样。另外,PHP Mcrypt默认使用零填充,因此您可能还需要CryptJS.pad.ZeroPadding.Yes,但我无法更改JS。创建它的人决定使用字符串作为键(因为键参数将被忽略,如您前面所说)。您可以使用`字符来表示内联代码片段。要匹配PHP,您不能使用字符串作为键——您必须使用单词数组。尝试var key=CryptoJS.enc.Utf8.parse('euhe68vjdr1aX4F091c7aCggSMBf0A7M')。否则CryptJS就像从密码短语派生密钥一样。另外,PHP Mcrypt默认使用零填充,因此您可能还需要CryptJS.pad.ZeroPadding.Yes,但我无法更改JS。无论是谁创造了它,都决定了我们