C#到节点加密哈希-md5和sha256

C#到节点加密哈希-md5和sha256,c#,node.js,aes,md5,cryptojs,C#,Node.js,Aes,Md5,Cryptojs,这是我试图移植到节点加密中的C代码,但由于我不懂C,这证明有点棘手 public static string EncryptStringToBytes_Aes(string username, string password) { string encrypted = string.Empty; byte[] clearBytes = Encoding.UTF8.GetBytes(password); Console.WriteLine("1." +

这是我试图移植到节点加密中的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#回复:

节点工作方式:

  • crypto.createCipheriv()
    看起来确实是个不错的选择,但是我不相信c#方法(SHA256.Create()&MD5.Create())会关心密钥和iv的长度,但是
    crypto.createCipheriv()

  • c#使用了加密流:因此我认为某种缓冲区是合适的


非常感谢您的帮助

.Net Framework-AES加密默认使用256位密钥、CBC模式和PKCS7填充

端口的代码非常易于阅读,它只执行以下操作:

return

BASE64 (
    AES_ENCRYPT (
        password,
        Key: SHA256(username),
        IV: MD5(username)
   )
)
在节点上也可以轻松实现这一点

const crypto = require('crypto');

const key = crypto.createHash('sha256').update('username', 'utf8').digest();
const iv = crypto.createHash('md5').update('username', 'utf8').digest();

const encryptor = crypto.createCipheriv("aes-256-cbc", key, iv);

var crypted = Buffer.concat([encryptor.update('password', 'utf8'), encryptor.final()]);

let base64data = crypted.toString('base64');

console.log(base64data);

SHA256
MD5
不关心散列数据的长度,但
AES
当然关心密钥和iv的长度。用户名的SHA256散列长度为32字节或256位。用户名的MD5哈希值为16字节或128位。两者都是
AES
支持的尺寸。因此,我对node中的
crypto
了解不多,但我认为如果您以相同的方式对用户名进行哈希运算以获取密钥和iv,您可以将它们提供给
crypto.createCipheriv