javascript - 使用 CryptoJs 加密并使用 Phalcon 解密

标签 javascript php encryption phalcon cryptojs

我正在尝试从 CryptoJS 加密一些文本并使用 Phalcon 对其进行解密。

我加密如下,

CryptoJS.AES.encrypt("MyText", 'key123');

现在比较一下,我用 Phalcon 加密了相同的值,

$this->crypt = new Crypt();
$this->crypt->encrypt("MyText", 'key123');

现在我从 JS 和 PHP 得到的值是不同的。

Phalcon 默认加密是 AES,CryptoJS 也是如此。

请帮我解决这个问题。我想在双方都有相同的值(value)。

最佳答案

Phalcon 中的默认密码是 Rijndael-256,CryptoJS 不支持它。有必要将其更改为 Rijndael-128 (AES)。为了能够加密任意二进制数据,还需要在 Phalcon 中使用某种填充模式。

$keyHex = "0102030405060708090a0b0c0d0e0f";

$this->crypt = new Crypt();
$this->crypt->setPadding($this->crypt->PADDING_PKCS7);
$this->crypt->setCipher("rijndael-128");

// encryption
$ct = base64_encode($this->crypt->encrypt("MyText", hex2bin($keyHex)));

// decryption
var_dump($this->crypt->decrypt(base64_decode($ct), hex2bin($keyHex)));

128 位的初始化向量以密文为前缀,因此在 CryptoJS 中必须以相同的方式完成。

var key = CryptoJS.enc.Hex.parse("0102030405060708090a0b0c0d0e0f");
var iv = CryptoJS.lib.WordArray.random(128/8);
var ct = CryptoJS.AES.encrypt("MyText", key, {
    iv: iv
}).ciphertext;
return iv.concat(ct).toString(CryptoJS.enc.Base64);

注意事项:

  • key 必须是随机生成的。这是一个 16 字节 key 示例(32 个十六进制),它必须具有特定长度。 AES 支持 16、24 和 32 字节(32、48、64 十六进制)的 key 大小。

  • IV 是为每次加密随机生成的,因此无法在 CryptoJS 和 Phalcon 中使用相同的 key 加密相同的文本以检查兼容性。需要一个加密,一个解密。

  • 未经身份验证的对称加密可能非常危险。在您的情况下可能会发起 padding-oracle 攻击。添加身份验证的常见方法是使用单独的 key 在 IV + 密文上运行消息身份验证代码。 HMAC-SHA256 与 encrypt-then-MAC在这方面,scheme 是一个不错的选择。

  • 如果“ key ”作为字符串传递给 CryptoJS.AES.encrypt,那么它会调用一个 OpenSSL 兼容的 key 派生函数 (EVP_BytesToKey)。给定的“ key ”被假定为密码,因此它会生成一个随机盐,并从这两者中派生出实际的 key 和 IV。

  • Phalcon 使用 mcrypt,这是一个废弃软件,有很多错误。

关于javascript - 使用 CryptoJs 加密并使用 Phalcon 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37651230/

相关文章:

c# - C# 和 PHP 上的 Blowfish 加密产生不同的结果

javascript - 如何遍历模板文字中的对象数组并为每个对象使用函数?

javascript - 如何在下拉列表中启用多个条件?

php - session 数组中的 array_search()

algorithm - 特定算法如何解密?

Java不可靠的字符串RSA加密/解密

javascript - 由于javascript冲突,无法上传图片

javascript - 用于选择所选值的 ExtJS 4 Combobox 事件

php - 如何从 MySql 获取日期明智的报告

php - 使用 Doctrine ORM : Custom repository