【问题标题】:Encrypt with CryptoJs and Decrypt with Phalcon使用 CryptoJs 加密并使用 Phalcon 解密
【发布时间】:2016-10-05 16:41:21
【问题描述】:

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

我加密如下,

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

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

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

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

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

请帮助我。我希望双方的价值相同。

【问题讨论】:

  • 你在 JS 和 Phalcon 端的加密设置是否相同? (我曾经遇到过这个问题,这个问题帮助了我:stackoverflow.com/questions/16600509/…
  • 嗨@Timothy,首先我是默认设置的。但随后将其更改为具有特定值,例如您提供的链接。仍然无法使其工作。

标签: javascript php encryption phalcon cryptojs


【解决方案1】:

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);

注意事项:

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

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

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

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

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

【讨论】:

  • 我实际上并没有运行 Phalcon,所以这段代码只是通过阅读它的source code 创建的。
  • 嗨@Artjom B.,感谢您的回复。你能解释一下这条线吗? var ct = CryptoJS.AES.encrypt("MyText", key, { iv: iv }).ciphertext;
  • Phalcon 会为您处理 IV,但 CryptoJS 不会,因此有必要提供特定的 IV。 CryptoJS.AES.encrypt(...) 的结果是一个CipherParams 对象,除了实际密文之外,它还包含大量信息。这里你只需要密文,所以你只检索它。
  • 谢谢@Artjom B.. 现在我明白了。 ciphertext 的值是多少。这个变量让我很困惑。提前致谢
  • CryptoJS.AES.encrypt(...).ciphertextWordArray,它是 CryptoJS 中二进制数据的内部表示。
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2015-06-13
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多