编程语言
首页 > 编程语言> > javascript-使用CryptoJs加密并使用Phalcon解密

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

作者:互联网

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

我加密如下

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

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

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

现在我从JS和PHP获得的值是不同的.

Phalcon默认加密为AES,CryptoJS中也是如此.

请帮我.我希望双方都具有相同的价值.

解决方法:

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,cryptojs,encryption,javascript,php
来源: https://codeday.me/bug/20191118/2029144.html