C# к узлу крипто-хеширования - md5 и sha256 - PullRequest
0 голосов
/ 31 марта 2020

Вот код C#, который я пытаюсь перенести в криптографию Node, но, поскольку я не знаю, 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# repl:

https://repl.it/@HarryLincoln / NeglitablePoisedHexagon

Работа узла:

  • crypto.createCipheriv() определенно выглядит как путь к go, но я не верю, что методы c# (SHA256.Create () и MD5.Create ()) заботятся о длине ключа и iv - но crypto.createCipheriv() делает.

  • C # использует CryptoStream: так что я думаю, что некоторый тип буфера в порядке, глядя на некоторые похожие C# -> Node crypto stuff

Буду очень признателен за помощь!

1 Ответ

1 голос
/ 31 марта 2020

. Net Framework - AES-шифрование использует 256-битный ключ и режим CB C и заполнение 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);
...