我有一个旧的嵌入式设备,需要使用特定的密码算法、密钥和初始向量进行加密。一款现有的 .NET Framework 应用程序创建了一个 AES-128-CBC 加密的字符串,现在我正在使用 Node.js 的 Crypto 库将其重写。
但是,当我在 Node.js 中使用相同的密钥和初始向量对字符串进行加密时,输出结果与 .NET 中不同。我已经使用在线工具双重检查了加密结果,在线工具得出的结果与 .NET 相同,因此问题出在 Node.js 的 Crypto 库上。
.NET 的 C# 代码如下(这里为了演示目的,密钥和初始向量已被替换):
byte[] encrypted;
using (AesManaged aes = new AesManaged())
{
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Zeros;
aes.Key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
aes.IV = new byte[] { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 };
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write("admin");
}
encrypted = msEncrypt.ToArray();
}
}
}
return encrypted;
这里给出Base64字符串gE1twb8LV/44oO/6UKwwCg==
。我已经用在线工具测试了相同的加密方法、密钥和IV,它们都输出相同的结果。
我的Node.js代码:
const crypto = require('crypto');
const key = Buffer.from('00112233445566778899aabbccddeeff', 'hex');
const iv = Buffer.from('aabbccddeeff00112233445566778899', 'hex');
const plaintext = 'admin';
var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
cipher.update(Buffer.from('admin'));
var encrypted = cipher.final().toString('base64');
这将给出Base64字符串4TT9E4WDH/TmlKjJdVFeHQ==
。
我已尝试了所有我能想到的方法,但没有成功。 我注意到.NET代码指定了零填充,但我无法找到在Node.js Crypto中设置此选项的方法。我猜这可能是为什么它没有给出相同输出的原因。
有人知道如何在Node.js Crypto中指定零填充吗?