c# - 将 Node.js aes-128-ecb (hex) 加密与 C# .NET Core 3.1 匹配
问题描述
我正在使用一个外部 API,它期望使用 aes-128-ecb(十六进制)加密的请求正文。我使用 Node.js 和下面的代码让它与 JavaScript 一起工作(每个会话使用相同的密钥,但这不是这里的问题):
var crypto = require('crypto'),
algorithm = 'aes-128-ecb',
key = 'E572F45E8D79CAF92B4BD3B375820831';
var fetchlist = {
fetch_list: '[{"name":"itemInfo","controller":"catalog.BLCCatalogItem","method":"getDetailWithColor","params":[264,86]}]',
};
var message = JSON.stringify(fetchlist);
var cipher = crypto.createCipher(algorithm, key);
var crypted = cipher.update(message, 'utf8', 'hex');
crypted += cipher.final('hex');
我现在还想从我的 C# .NET Core 3.1 做一些请求。应用程序,但无论我尝试什么,我都没有得到相同的结果。API 也不接受我的请求。
var fetchList = new FetchList();
fetchList.fetch_list = "[{\"name\":\"itemInfo\",\"controller\":\"catalog.BLCCatalogItem\",\"method\":\"getDetailWithColor\",\"params\":[264,86]}]";
string message = JsonConvert.SerializeObject(fetchList);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 128;
aes.Key = UTF8Encoding.UTF8.GetBytes(Key);
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
byte[] data = Encoding.UTF8.GetBytes(message);
ICryptoTransform encrypt = aes.CreateEncryptor();
byte[] dest = encrypt.TransformFinalBlock(data, 0, data.Length);
StringBuilder hex = new StringBuilder(dest.Length * 2);
foreach (byte b in dest)
hex.AppendFormat("{0:x2}", b);
var output = hex.ToString();
和 FetchList 类:
public class FetchList
{
public string fetch_list { get; set; }
}
解决方案
感谢@Topaco,我能够解决我的问题。这是代码现在的样子:
var key = new OpenSslCompatDeriveBytes(UTF8Encoding.UTF8.GetBytes("E572F45E8D79CAF92B4BD3B375820831"), null, "MD5", 1).GetBytes(16);
var fetchList = new FetchList();
fetchList.fetch_list = "[{\"name\":\"itemInfo\",\"controller\":\"catalog.BLCCatalogItem\",\"method\":\"getDetailWithColor\",\"params\":[137696,115]}]";
string message = JsonConvert.SerializeObject(fetchList);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 128;
aes.Key = key;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
byte[] data = Encoding.UTF8.GetBytes(message);
ICryptoTransform encrypt = aes.CreateEncryptor();
byte[] dest = encrypt.TransformFinalBlock(data, 0, data.Length);
StringBuilder hex = new StringBuilder(dest.Length * 2);
foreach (byte b in dest)
hex.AppendFormat("{0:x2}", b);
var output = hex.ToString();
推荐阅读
- image - Webpack 5:sass 找不到图像的路径
- r - 如何使用 Boruta 输出快速有效地从 R 中的 glm 中排除变量
- android - 在协程范围内调试时丢失对局部变量的引用
- django - Django Rest Framework - 我有使用 curl 命令的 API,如何更改它以使用浏览器中的标准 http 请求?
- r - R - 组合两个字符向量,然后切断最后一个字符
- excel - Excel 中的自动格式化
- php - Windows 上的 NGINX - 未指定输入文件
- ios - 使用 AWS 生成的适用于 iOS 的开发工具包调用 API 时出错,即使用户已登录
- ansible - 带有 terraforn 的 Jenkins 管道 - 如何将输出变量馈送到以下 Ansible 阶段
- sql - SELECT QUERY 中的 INDIRECT