wake-up-neo.com

Verwendung der Rijndael-Verschlüsselung mit einer .NET Core-Klassenbibliothek (Nicht .Net Framework)

Wie verwenden wir die Rijndael-Verschlüsselung in einer .NET Core-Klassenbibliothek? (Keine .Net Framework-Klassenbibliothek) Wir müssen eine gemeinsam genutzte .Net Core-Bibliothek für die Verwendung in mehreren Projekten erstellen und Encrypt- und Decrypt-Methoden implementieren, die die gleiche Rijndael-Verschlüsselung für die Projekte verwenden.

Wir verwenden derzeit:

  • VS Enterprise 2015
  • c #
  • .NET Core-Klassenbibliothek
  • .NETStandard, Version = v1.6 Referenz

Es scheint, dass die Implementierung von Rijndael und AES in der .Net Core 1.0-Version fehlt ... es scheint nur die Basisklassen zu umfassen. Wie erhalten wir eine .Net Core-Implementierung der Rijndael- oder AES-Verschlüsselung als Referenz für ein neues .Net Core Class Library-Projekt?

Hier ist die Encrypt-Methode, die in .NET Framework 4.5.2 funktioniert:

    public static string Encrypt(string valueToEncrypt, string symmetricKey, string initializationVector)
    {
        string returnValue = valueToEncrypt;

        var aes = new System.Security.Cryptography.RijndaelManaged();
        try
        {
            aes.Key = ASCIIEncoding.ASCII.GetBytes(symmetricKey);
            aes.IV = ASCIIEncoding.ASCII.GetBytes(initializationVector);
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.ISO10126;

            var desEncrypter = aes.CreateEncryptor();
            var buffer = ASCIIEncoding.ASCII.GetBytes(valueToEncrypt);

            returnValue = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length));
        }
        catch (Exception)
        {
            returnValue = string.Empty;
        }

        return returnValue;
    }
12
Ensunder

Der Unterschied (in .NET) zwischen Rijndael und AES besteht darin, dass Rijndael die Änderung der Blockgröße zulässt, AES jedoch nicht. Da die Standardblockgröße von RijndaelManaged der AES-Blockgröße (128 Bit/16 Byte) entspricht, verwenden Sie AES.

Anstatt den Implementierungstyp anhand des Namens zu instanziieren, verwenden Sie einfach die Factory (Aes.Create()). Das funktioniert sowohl in .NET Core als auch in .NET Framework.

Andere erwähnenswerte Dinge:

  • Alle SymmetricAlgorithm-Instanzen sind IDisposable. Sie sollten sie in einer using-Anweisung verwenden.
  • Alle ICryptoTransform-Instanzen (wie z. B. Ihre falsch benannte desEncryptor) sind IDisposable. Sie sollten sie in einer using-Anweisung verwenden.
  • Das Auffüllen von ISO10126 ist in .NET Core 1.0 nicht verfügbar. Wenn Sie mit vorhandenen Streams kompatibel sein müssen, können Sie die Auffüllung selbst anwenden und PaddingMode.None angeben. Ansonsten ist PKCS7 mehr Standard.
  • Ihr AES-Schlüssel ist nicht zufällig, da er aus einer Zeichenfolge ASCII stammt (viele Werte sind nicht gültig) .
    • Base64 hat mindestens den vollen Wertebereich
    • PBKDF2 (Kennwortbasierte Schlüsselableitungsfunktion 2) über die Rfc2898DeriveBytes-Klasse ermöglicht das Vorhersagen von Rauschen durch Shared-String-Secret.
    • KeyAgreement ist im Allgemeinen besser, aber in .NET Core 1.0 sind weder ECDH noch klassisches DH verfügbar.
  • Normalerweise sollte der Verschlüsseler eine zufällige IV berechnen lassen (Aufruf aes.GenerateIV(), wenn dasselbe Objekt für mehrere Operationen verwendet wird) und mit dem Chiffretext versehen. Verschlüsseln nimmt also einen Schlüssel und Klartext und erzeugt einen Geheimtext und IV. Decrypt nimmt (Schlüssel, IV, Geheimtext) und erzeugt Klartext.
21
bartonjs

Wenn Sie nur Dinge verschlüsseln/entschlüsseln möchten, vermeiden Sie die direkte Verwendung von Rijndael, da der asp.net-Kern einige schönere Wrapper hat, die viel einfacher zu verwenden sind und wahrscheinlich standardmäßig ordnungsgemäß gesichert sind. Es ist als DataProtection bekannt.

using Microsoft.AspNetCore.DataProtection;

// During startup add DP
serviceCollection.AddDataProtection();

...

// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
    _protector = provider.CreateProtector("Contoso.MyClass.v1");
}

...

// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");

...

// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");

Weitere Informationen finden Sie in den Datenschutzdokumenten

0
alastairtree