2016-07-12 39 views
10

Jak korzystać z szyfrowania Rijndael w bibliotece klasy .NET Core? (Nie. Biblioteka klasy .Net Framework) Musimy utworzyć współużytkowaną bibliotekę .Net Core do wykorzystania w wielu projektach i musimy zaimplementować metody szyfrowania i deszyfrowania, które używają tego samego szyfrowania Rijndael we wszystkich projektach.Jak korzystać z szyfrowania Rijndael przy użyciu biblioteki klas .Net Core? (Nie .Net Framework)

Obecnie używamy:

  • Przedsiębiorstwo VS 2015 C#
  • Net Rdzeń Class Library
  • .NETStandard, Version = odniesienie v1.6 To wydaje

  • brak implementacji Rijndael i AES w wydaniu .Net Core 1.0 wydaje się obejmować tylko klasy bazowe. W jaki sposób możemy uzyskać implementację szyfrowania Rijndael lub AES w .Net Core jako odniesienie do nowego projektu biblioteki .Net Core Class Library?

    Oto metoda Szyfrowanie który działa w .NET Framework 4.5.2:

    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; 
        } 
    
  • +1

    Jaki jest problem w .NET Rdzenia? Czy brakuje biblioteki? –

    +2

    Wygląda na to, że jest na mapie drogowej wydania 1.1: https://github.com/dotnet/corefx/issues/9984 –

    +0

    Prawidłowy Nate, głównym problemem wydaje się być brak implementacji Rijndael w referencji do kryptografii w bieżącym wydanie .Net Core ... po prostu podstawowe implementacje klasy. – Ensunder

    Odpowiedz

    19

    Różnica (w .NET) między Rijndael i AES Rijndael jest to, że pozwala zmienić rozmiar bloku, ale robi AES nie. Ponieważ domyślny rozmiar bloku RijndaelManaged jest taki sam jak rozmiar bloku AES (128 bitów/16 bajtów), w rzeczywistości używasz AES.

    Zamiast tworzyć typ implementacji według nazwy, wystarczy użyć fabryki (Aes.Create()). To działa zarówno w środowisku .NET Core, jak i .NET Framework.

    Inne rzeczy warto wspomnieć:

    • przypadki Wszystko SymmetricAlgorithm są IDisposable, należy ich używać w using oświadczeniu.
    • Wszystkie wystąpienia ICryptoTransform (takie jak niepoprawnie nazwane desEncryptor) są identyfikowalne, należy ich używać w oświadczeniu using.
    • Wypełnienie ISO10126 nie jest dostępne w .NET Core 1.0. Jeśli chcesz być kompatybilny z istniejącymi strumieniami, możesz sam zastosować dopełnienie i określić PaddingMode.None. W przeciwnym razie PKCS7 jest bardziej standardowy.
    • Twój klucz AES nie jest zbyt losowy, ponieważ pochodzi z łańcucha znaków ASCII (wiele wartości nie będzie ważnych).
      • Base64 przynajmniej ma pełny zakres wartości
      • PBKDF2 (hasło-Based Key Wyprowadzenie funkcji 2) za pośrednictwem Rfc2898DeriveBytes klasa pozwala na wspólną sznurek w tajnych, przewidywalny hałasu na zewnątrz.
      • KeyAgreement jest ogólnie lepszy, ale ani ECDH, ani klasyczne DH nie są dostępne w .NET Core 1.0.
    • Zwykle szyfrującego powinno pozwolić losowo IV jest obliczana (połączenie aes.GenerateIV() Jeżeli za pomocą tego samego obiektu dla wielu operacji) i przedstawia go z zaszyfrowanego tekstu. Tak więc szyfrowanie przyjmuje klucz i tekst jawny oraz tworzy zaszyfrowany tekst i IV. Odszyfruj trwa (klucz, IV, szyfrogram) i tworzy tekst jawny.
    +0

    bartonjs: przepraszam, jeśli to głupie pytanie, ale próbowałem poszukać, jak to zrobić ... w jaki sposób ręcznie zastosować obicie ISO10126? Musimy być kompatybilne z istniejącymi strumieniami. – Ensunder

    +0

    Rozszerz tablicę do wyrównania w bloku (dodając kolejny blok, jeśli już jest) i wypełnij go na https://en.wikipedia.org/wiki/Padding_(cryptography)#ISO_10126. Jeśli używasz strumieni, możesz albo spuścić do tablicy lub utworzyć niestandardową ICryptoTramsform, aby owinąć bieżącą i zastosować/usunąć dopełnienie w TransformFinalBlock. (Indywidualna transformacja oczywiście również działałaby dla bezpośrednich bajtów). – bartonjs

    +0

    Gdy używasz CFB z NoPadding. CreateEncryptor stworzony z Aes nie może mieć InputBlockSize == 1. RijndaelManaged nie ma tego problemu. – Diryboy

    0

    Jeśli chcesz tylko do szyfrowania/deszyfrowania rzeczy, należy unikać używania Rijndael bezpośrednio jako rdzeń asp.net ma jakieś znacznie ładniejsze obwoluty, które są znacznie łatwiejsze w obsłudze i bardziej prawdopodobne, aby być właściwie domyślnie zabezpieczone. Jest znany jako DataProtection.

    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}"); 
    

    Zobacz data protection docs więcej informacji

    Powiązane problemy