【发布时间】:2020-03-31 13:26:07
【问题描述】:
这是我尝试移植到 Node 加密中的 C# 代码,但由于我不懂 c#,所以这有点棘手!
public static string EncryptStringToBytes_Aes(string username, string password)
{
string encrypted = string.Empty;
byte[] clearBytes = Encoding.UTF8.GetBytes(password);
Console.WriteLine("1." + clearBytes);
using (Aes aesAlg = Aes.Create())
{
byte[] k; byte[] iv;
byte[] bytes = Encoding.UTF8.GetBytes(username);
k = SHA256.Create().ComputeHash(bytes);
iv = MD5.Create().ComputeHash(bytes);
aesAlg.Key = k;
aesAlg.IV = iv;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
csEncrypt.Write(clearBytes, 0, clearBytes.Length); }
encrypted = Convert.ToBase64String(msEncrypt.ToArray());
}
}
return encrypted;
}
C# 复制:
https://repl.it/@HarryLincoln/NegligiblePoisedHexagon
节点工作原理:
crypto.createCipheriv()绝对看起来像要走的路,但我不相信 c# 方法 (SHA256.Create() & MD5.Create()) 关心密钥的长度和 iv -但是crypto.createCipheriv()可以。c# 使用 CryptoStream:所以我认为某种 Buffer 是为了查看一些 similar C# -> Node crypto stuff
非常感谢您的帮助!
【问题讨论】:
-
SHA256和MD5不关心您要散列的数据的长度,但AES当然关心密钥和 iv 的长度。用户名的 SHA256 散列为 32 字节或 256 位。用户名的 MD5 散列为 16 个字节或 128 位。两者都是AES支持的尺寸。因此,我对来自节点的crypto了解不多,但我想如果您以相同的方式对用户名进行哈希处理以获取密钥和iv,您可以将它们提供给crypto.createCipheriv
标签: c# node.js aes md5 cryptojs