首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Php和cryptoJS IV

Php和cryptoJS IV
EN

Stack Overflow用户
提问于 2016-03-10 02:47:40
回答 2查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
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时,我尝试使用以下命令进行加密:

代码语言:javascript
复制
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(text), CryptoJS.enc.Hex.parse(key), { iv: CryptoJS.enc.Hex.parse(iv) });

但我也需要像PHP一样存储IV,所以我添加了:

代码语言:javascript
复制
var withIV = iv+encrypted;

但这不是编码的。所以我加了一句:

代码语言:javascript
复制
CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(withIV));

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

EN

回答 2

Stack Overflow用户

发布于 2016-03-10 10:30:19

下面是我用CryptoJS加密数据的方法:

代码语言:javascript
复制
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中,我使用下面这行代码对该函数生成的加密字符串进行解密:

代码语言:javascript
复制
openssl_decrypt($encrypted_data_string, "AES-128-CBC", hex2bin($key_hex_string), 0, hex2bin($iv_hex_string));

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-11 04:57:43

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

代码语言:javascript
复制
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);

代码语言:javascript
复制
// 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;
代码语言:javascript
复制
<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>

这将产生与以下相同的输出

代码语言:javascript
复制
base64_encode($iv.openssl_encrypt($data, 'aes-256-cbc', $secret, 0, $iv));

只要iv实际上是十六进制编码的字符串,其中包含与$iv中的解码版本相同的字节。对于text (编码除外)、key$data$secret也必须如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35900083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档