Javascript Php和cryptoJS IV

Javascript Php和cryptoJS IV,javascript,php,encryption,cryptojs,Javascript,Php,Encryption,Cryptojs,我使用PHP加密和解密数据,如下所示: <?php function encrypt($data, $secret){ $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); return base64_encode($iv.openssl_encrypt($data, 'aes-256-c

我使用PHP加密和解密数据,如下所示:

<?php 
function encrypt($data, $secret){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    return base64_encode($iv.openssl_encrypt($data, 'aes-256-cbc', $secret, 0, $iv));
}

function decrypt($encryptedData, $secret){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $data = base64_decode($encryptedData);
    $iv = substr($data, 0, $iv_size);
    return openssl_decrypt(substr($data, $iv_size), 'aes-256-cbc', $secret, 0, $iv);
}
?>
但我还需要像使用PHP一样存储IV,因此我添加了:

var withIV = iv+encrypted;
CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(withIV));
但这不是编码的。因此,我补充说:

var withIV = iv+encrypted;
CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(withIV));

但由于某些原因,这与上面的PHP编码不同?

以下是我如何使用CryptoJS加密数据:

function encrypt(str, key, iv) {
    var key = CryptoJS.enc.Hex.parse(key);
    var iv = CryptoJS.enc.Hex.parse(iv);
    return CryptoJS.AES.encrypt(str, key, { iv: iv }).toString();
};
在PHP中,我使用以下代码行解密该函数生成的加密字符串:

openssl_decrypt($encrypted_data_string, "AES-128-CBC", hex2bin($key_hex_string), 0, hex2bin($iv_hex_string));

我想如果你想的话,你可以用base64而不是十六进制来编码/解码加密数据。无论如何,希望这有帮助

以下是我如何使用CryptoJS加密数据:

function encrypt(str, key, iv) {
    var key = CryptoJS.enc.Hex.parse(key);
    var iv = CryptoJS.enc.Hex.parse(iv);
    return CryptoJS.AES.encrypt(str, key, { iv: iv }).toString();
};
在PHP中,我使用以下代码行解密该函数生成的加密字符串:

openssl_decrypt($encrypted_data_string, "AES-128-CBC", hex2bin($key_hex_string), 0, hex2bin($iv_hex_string));

我想如果你想的话,你可以用base64而不是十六进制来编码/解码加密数据。无论如何,希望这有帮助

在CryptoJS中连接IV和密文似乎有困难。这相当容易,因为CryptoJS的原生二进制数据格式(
WordArray
)支持
concat
函数:

var ivWords = CryptoJS.enc.Hex.parse(iv); // WordArray instance
var plaintext = CryptoJS.enc.Utf8.parse(text); // WordArray instance
var keyWords = CryptoJS.enc.Hex.parse(key); // WordArray instance
var encrypted = CryptoJS.AES.encrypt(plaintext, keyWords, { iv: ivWords }); // CipherParams instance

var ct = ivWords.clone().concat(encrypted.ciphertext); // WordArray instance
var ct = ct.toString(CryptoJS.enc.Base64); // string instance
console.log(ct);
//示例数据
var iv=“0102030405060708090a0b0c0d0e0f”;
var text=“text”;
var key=“1112131415161718191a1b1c1d1e1f”;
//实际代码
var ivWords=CryptoJS.enc.Hex.parse(iv);//字数组实例
var plaintext=CryptoJS.enc.Utf8.parse(text);//字数组实例
var keyWords=CryptoJS.enc.Hex.parse(key);//字数组实例
var encrypted=CryptoJS.AES.encrypt(明文,关键字,{iv:ivWords});//CipherParams实例
var ct=ivWords.clone().concat(加密的.ciphertext);//字数组实例
var ct=ct.toString(CryptoJS.enc.Base64);//字符串实例
output.innerHTML=ct

在CryptoJS中连接IV和密文似乎有问题。这相当容易,因为CryptoJS的原生二进制数据格式(
WordArray
)支持
concat
函数:

var ivWords = CryptoJS.enc.Hex.parse(iv); // WordArray instance
var plaintext = CryptoJS.enc.Utf8.parse(text); // WordArray instance
var keyWords = CryptoJS.enc.Hex.parse(key); // WordArray instance
var encrypted = CryptoJS.AES.encrypt(plaintext, keyWords, { iv: ivWords }); // CipherParams instance

var ct = ivWords.clone().concat(encrypted.ciphertext); // WordArray instance
var ct = ct.toString(CryptoJS.enc.Base64); // string instance
console.log(ct);
//示例数据
var iv=“0102030405060708090a0b0c0d0e0f”;
var text=“text”;
var key=“1112131415161718191a1b1c1d1e1f”;
//实际代码
var ivWords=CryptoJS.enc.Hex.parse(iv);//字数组实例
var plaintext=CryptoJS.enc.Utf8.parse(text);//字数组实例
var keyWords=CryptoJS.enc.Hex.parse(key);//字数组实例
var encrypted=CryptoJS.AES.encrypt(明文,关键字,{iv:ivWords});//CipherParams实例
var ct=ivWords.clone().concat(加密的.ciphertext);//字数组实例
var ct=ct.toString(CryptoJS.enc.Base64);//字符串实例
output.innerHTML=ct


不要将php中的文本直接转储到json上下文中。虽然b64是相当安全的,但该密钥可能包含js元字符。您应该使用json_encode:
var foo=所以你总是在生成有效的javascript。@MarcB你能把我链接到一些关于你所说内容的信息吗?我一点也不明白为什么我现在做的不好(php:
$name=“Miles O'Brien”
,然后您将其回显到JS:
var JS='Miles O'Brien';
-哎呀,语法错误,现在您的JS代码块已经死了。使用json_encode将生成正确/有效的
var JS='Miles O'Brien';
啊哈!!对不起,我太蠢了!我会开始这样做的。关于上面的编码问题有什么想法吗?不要将php中的文本转储到直接使用json上下文。虽然b64是相当安全的,但该键可以包含js元字符。您应该使用json_encode:
var foo=;
,所以您总是生成有效的javascript。@MarcB您能将我链接到一些关于您正在谈论的内容的详细信息吗?我不知道为什么我要做的是b广告:(php:
$name=“Miles O'Brien”
,然后将其回送到JS:
var JS='Miles O'Brien';
-哎呀,语法错误,现在你的JS代码块已经死了。使用json_encode将生成正确的/有效的
var JS='Miles O'Brien';
啊哈!!对不起,我太蠢了!我会开始这样做的。关于上面的编码问题有什么想法吗?太棒了!!有办法解决这个问题吗与我使用php
mcrypt\u create_iv()
生成iv的方式类似,对iv进行评级?因为如果我通过say
var iv=”“
生成iv,并且使用相同的
文本两次,它将返回相同的
ct
?那么,每次加密都需要生成一个新的(且不可预测的)iv。
Math.random()
对于加密属性来说随机性不够。有关详细信息,请参见以下链接下的我的答案:谢谢!我在这一行上遇到了错误
无效数组长度
var ct=ivWords.clone().concat(encrypted.ciphertext);
?请在不使用
的情况下尝试它
。我查看了函数,发现它的实现似乎不正确。我无法重现您的问题。我添加了一个可运行的代码段。太棒了!!有没有一种方法可以生成iv,就像我使用php
mcrypt\u create\u iv()
?因为如果我通过say
var iv=“”生成iv一样
我使用相同的
文本
两次,它将返回相同的
ct
?那么,您需要为每次加密生成一个新的(且不可预测的)IV。
Math.random()
对于加密属性来说随机性不够。有关详细信息,请参见以下链接下的我的答案:谢谢!我在这一行上遇到了错误
无效数组长度
var ct=ivWords.clone().concat(encrypted.ciphertext);
?请在不使用
的情况下尝试它
。我查看了该函数,发现它的实现似乎不正确。我无法重现您的问题。我添加了一个可运行的代码段。