PHP使用CryptoJS在JavaScript中打开openssl_encrypt

恩尼斯

我在使用第三方PHP服务器提供的JavaScript中生成相同的密文时遇到问题。服务器端使用简单的单行代码生成密钥,但是我找不到在JavaScript客户端中执行相同操作的方法。

我决定从其他SO答案中使用CryptoJS库,并且确实生成了密文,但它与PHP服务器中的密文不同。

PHP加密:

echo openssl_encrypt("5905","AES-256-CBC","FbcCY2yCFBwVCUE9R+6kJ4fAL4BJxxjdRcqy5rHVLwU=",NULL,"e16ce913a20dadb8");
// phgygAJB3GA0sa4D9k/d8A==

我尝试了来自Stack Overflow的几种解决方案,但这些解决方案未能创建相同的密文。

另外,PHP一线式的参数“ AES-256-CBC”使我感到困扰:我知道AES是什么,但是我不知道那256个或CBC部分是什么,并且我不知道在哪里设置它们。 CryptoJS方面。

我目前的尝试:

var key = 'FbcCY2yCFBwVCUE9R+6kJ4fAL4BJxxjdRcqy5rHVLwU=';
var iv = 'e16ce913a20dadb8';
var encrypted = CryptoJS.AES.encrypt("5905", CryptoJS.enc.Hex.parse(key), { iv: CryptoJS.enc.Hex.parse(iv) });
var r1 = encrypted.ciphertext.toString(); // def44f8822cfb3f317a3c5b67182b437
var r2 = CryptoJS.enc.Base64.stringify(encrypted.ciphertext) // 3vRPiCLPs/MXo8W2cYK0Nw==

我的猜测是我在JavaScript中的某个地方缺少了“ 256”和“ CBC”参数。

Artjom B.

您的“密钥”长为44个字符,在PHP中也等于44个字节。这不是有效的密钥大小。AES仅支持16、24和32字节密钥。无论如何,此“密钥”将被截断为32个字节。因此,您在PHP中的实际键是:

"FbcCY2yCFBwVCUE9R+6kJ4fAL4BJxxjd"

您的IV长度为16个字符(和字节),因此长度正确,可以原样使用。

这也是为什么您可以将CryptoJS中的密钥和IV视为字符串:

CryptoJS.AES.encrypt("5905", CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv) });

但是正确的方法是从Base64解码密钥并生成适当的IV,该IV是编码为Hex时的两倍。使用前应从十六进制解码。

IV必须是不可预测的(读取:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上也不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密的,因此您可以将其与密文一起发送。通常,它只是简单地放在密文的前面,并在解密之前将其切开。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JavaScript中重复的php openssl_encrypt

使用PHP加密(openssl_encrypt),然后使用JS解密(CryptoJS)

CryptoJS AES解密用PHP openssl_encrypt加密的消息

PHP:使用 openssl_encrypt 加密文件

正确使用php openssl_encrypt的方法

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

PHP aes-128-gcm openssl_decrypt仅在使用openssl_encrypt后才能工作

Tyring 使用 PHP 的 OpenSSL_encrypt/OpenSSL_decrypt 加密/解密数据

在 PHP 中将 mcrypt_encrypt 转换为 openssl_encrypt

使用golang解密使用php openssl_encrypt加密的文件

在PHP openssl_encrypt和golang河豚中匹配河豚加密

使用openssl_encrypt AES-CBC的Python到PHP兼容的AES加密

我想使用 openssl_encrypt 解密在 php 中加密的文本

PHP AES 加密 JAVA 到 PHP - openssl_encrypt

使用openssl_encrypt / openssl_decrypt将C#TripleDES ECB解密/加密转换为PHP

java中的openssl_encrypt 256 CBC raw_data

如何复制openssl_encrypt?

openssl_encrypt 的密码方法

解密工作使用 PHP (openssl) 而不是使用 javascript (cryptojs)

使用CryptoJS(JAVASCRIPT)和OpenSSL(PHP)实现相同的加密

openssl_encrypt VS mcrypt_encrypt

使用AES-128-CTR加密在PHP(openssl_encrypt)与Node.js(crypto)上给出了不同的结果

PHP将MCRYPT_ENCRYPT转换为OPENSSL_ENCRYPT(SOAP头)

openssl_decrypt不解密使用openssl_encrypt存储的数据

OpenSSL还是Mcrypt?(openssl_encrypt或mcrypt_encrypt)

用openssl_encrypt替换mcrypt

如何在c#中从openssl_encrypt解密字符串

使用JavaScript加密(cryptojs),使用php openssl解密,无法重新创建消息密钥

从mcrypt_encrypt()迁移到openssl_encrypt()