CryptoJS AES-128-ECB和PHP openssl_encrypt不匹配

时间:2018-12-22 09:23:23

标签: javascript php openssl cryptojs

我在PHP上有一些代码,这些代码无法编辑,并且数据库中充满了以这种方式加密的消息。

$key = '297796CCB81D2553B07B379D78D87618'
return $encrypted = openssl_encrypt($data, 'AES-128-ECB', $key);

我必须编写一些JS代码来加密和解密这些消息。我为此使用CryptoJS。

const key = '297796CCB81D2553B07B379D78D87618'
let k = CryptoJS.enc.Base64.parse(key)
let cypher = CryptoJS.AES.encrypt(this.text, k, {mode: CryptoJS.mode.ECB})
this.cypher = CryptoJS.enc.Base64.stringify(cypher.ciphertext)

我无法获得这些代码来产生相同的结果。对于“测试”字符串,我得到以下结果:JS: H1AG6j/i/iSqifSNCG5JKw==PHP: Nqrur4UMEicEMwJC39qq0A==

我试图解决3天,但找不到问题。 我唯一可以编辑的代码是JS。

2 个答案:

答案 0 :(得分:1)

如果在PHP部分中将方法更改为AES-256-ECB,则它将使用相同的密钥(长度)。正是由于CrypoJS.AES,它会根据密钥的长度自行选择方法。

https://cryptojs.gitbook.io/docs/#the-cipher-algorithms

答案 1 :(得分:0)

我弄清楚是什么问题。 PHP中的openssl_encrypt将密钥作为UTF-8字符串。占用足够的长度后,它将忽略下一个字符,因此我们的密钥:'297796CCB81D2553B07B379D78D87618'修剪为'297796CCB81D2553'。 该代码有效:

// JS 
const key = '297796CCB81D2553'
let k = CryptoJS.enc.Utf8.parse(key)
let cypher = CryptoJS.AES.encrypt(this.text, k, {mode: CryptoJS.mode.ECB})
this.cypher = CryptoJS.enc.Base64.stringify(cypher.ciphertext)