我使用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);
}
?>我现在希望能够使用Crypto-JS在本地加密我的数据(与PHP方法相同)。我已经做了与上面相同的操作,以获得密钥和iv:
var key = '<?php echo $secret;?>';
var iv = '<?php echo base64_encode(mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND));?>';现在,当使用Crypto-JS时,我尝试使用以下命令进行加密:
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(text), CryptoJS.enc.Hex.parse(key), { iv: CryptoJS.enc.Hex.parse(iv) });但我也需要像PHP一样存储IV,所以我添加了:
var withIV = iv+encrypted;但这不是编码的。所以我加了一句:
CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(withIV));但由于某种原因,这与上面的PHP编码不同?
发布于 2016-03-10 10:30:19
下面是我用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));如果你愿意的话,我想你可以用64进制而不是十六进制来编码/解码加密的数据。无论如何,希望这对你有所帮助!
发布于 2016-03-11 04:57:43
在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);
// example data
var iv = "0102030405060708090a0b0c0d0e0f";
var text = "text";
var key = "1112131415161718191a1b1c1d1e1f";
// actual code
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
output.innerHTML = ct;<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/components/enc-base64-min.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>
<div id="output"></div>
这将产生与以下相同的输出
base64_encode($iv.openssl_encrypt($data, 'aes-256-cbc', $secret, 0, $iv));只要iv实际上是十六进制编码的字符串,其中包含与$iv中的解码版本相同的字节。对于text (编码除外)、key和$data、$secret也必须如此。
https://stackoverflow.com/questions/35900083
复制相似问题