在JavaScript中复制php openssl_加密

在JavaScript中复制php openssl_加密,javascript,php,encryption,aes,Javascript,Php,Encryption,Aes,我正在尝试使用JavaScript复制PHP字符串加密。以下是PHP代码: <?php $iv = "1234567890123456"; $key = "aaaaaaaaaaaaaaaa"; $input = "texttexttexttext"; $encrypted = openssl_encrypt($input, "AES-256-CBC", $key, 0, $iv); echo $encrypted; // "ZwY1i+vqP3acszeDiscCTx/R4a6d2A

我正在尝试使用JavaScript复制PHP字符串加密。以下是PHP代码:

<?php

$iv = "1234567890123456";
$key = "aaaaaaaaaaaaaaaa";
$input = "texttexttexttext";

$encrypted = openssl_encrypt($input, "AES-256-CBC", $key, 0, $iv);

echo $encrypted;
// "ZwY1i+vqP3acszeDiscCTx/R4a6d2AtkcInmN9OTCNE="

我不知道如何使它给出相同的输出。有什么想法吗?

有些事情出了问题:

首先,JavaScript代码的输出实际上是字符串
172,2,60159,71,10183,8,1,…
的base64编码,而不是原始字节缓冲区的编码。我真的不知道如何用惯用方法解决这个问题,但通过使用
aes.js
hex编码实用程序函数,我们可以将其转换为base64:

var hex = aesjs.utils.hex.fromBytes(encryptedBytes);
var buf = Buffer.from(hex, 'hex');

console.log(buf.toString('base64'));
// rAI8n0cKtwiu1N5hfDWs3g==
第二个问题是,在
aes.js
中,您使用的是AES128加密(
aaaaaaaa
长度为128位),但在PHP代码中使用的是AES256加密。我们应该更新PHP代码(或JS代码):

我们的产量几乎相同。但是等等,PHP输出的长度是原来的两倍。发生了什么事

嗯,OpenSSL。但是,Javascript代码未被添加。要解决这个问题,应该对javascript文本使用PKCS#7填充。为此,您可以使用模块。另一个选项是在计数器(CTR)模式下使用AES,而不是CBC模式,如果这是您的选项

这是我最后的PHP代码:

<?php
$iv = "1234567890123456";
$key = "aaaaaaaaaaaaaaaa";
$input = "texttexttexttext";
$encrypted = openssl_encrypt($input, "AES-128-CBC", $key, 0, $iv);
echo $encrypted;
// output: 'rAI8n0cKtwiu1N5hfDWs3rPbz0UmvlbW+LJliYox03c='

PS我个人更喜欢使用CTR模式,因为PKCS#7实现有时会暴露破坏加密的漏洞。(我检查了提到的pkcs#7库,它应该很好,但是。)

mtcyldisnjasmtu5ldcxlde4myw4lde…
解码到
172,2,60159,71,10183,8,1…
。它看起来像是
base64.base64.encode()
encryptedBytes
的字符串表示形式进行编码。如果您尝试
console.log(encryptedBytes.toString('base64'),输出是什么?这只是一个想法:在PHP中,显式使用256位键。使用aesjs时,密钥长度似乎由密钥变量的字节/位计数决定——在您的情况下,它是16*8=128位,而不是256位。
$encrypted = openssl_encrypt($input, "AES-128-CBC", $key, 0, $iv);
echo $encrypted;
// rAI8n0cKtwiu1N5hfDWs3rPbz0UmvlbW+LJliYox03c=
<?php
$iv = "1234567890123456";
$key = "aaaaaaaaaaaaaaaa";
$input = "texttexttexttext";
$encrypted = openssl_encrypt($input, "AES-128-CBC", $key, 0, $iv);
echo $encrypted;
// output: 'rAI8n0cKtwiu1N5hfDWs3rPbz0UmvlbW+LJliYox03c='
var aesjs = require("aes-js");
var base64 = require("js-base64");
var pkcs7 = require("pkcs7");

var iv = aesjs.utils.utf8.toBytes("1234567890123456");
var key = aesjs.utils.utf8.toBytes("aaaaaaaaaaaaaaaa");
var text = aesjs.utils.utf8.toBytes("texttexttexttext");

var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv);
var encryptedBytes = aesCbc.encrypt(pkcs7.pad(text));

var hex = aesjs.utils.hex.fromBytes(encryptedBytes);
var buf = Buffer.from(hex, 'hex');

console.log(buf.toString('base64'));
// output: 'rAI8n0cKtwiu1N5hfDWs3rPbz0UmvlbW+LJliYox03c='