2016-07-12 22 views
10

Làm thế nào để chúng tôi sử dụng mã hóa Rijndael trong thư viện lớp .Net Core? (Không phải là thư viện lớp Net Framework). Chúng ta cần tạo một thư viện Core .Net dùng chung trong nhiều dự án và cần thực hiện các phương thức mã hóa và giải mã sử dụng cùng một mã hóa Rijndael trên các dự án.Làm thế nào để sử dụng mã hóa Rijndael với thư viện lớp .Net Core? (Không phải .Net Framework)

Chúng tôi hiện đang sử dụng:

  • VS Enterprise 2015
  • C#
  • Net Lõi Class Library
  • .NETStandard, Version = v1.6 tham khảo

Nó xuất hiện rằng việc triển khai Rijndael và AES bị thiếu trong bản phát hành .Net Core 1.0 ... dường như chỉ bao gồm các lớp cơ sở. Làm thế nào để chúng tôi có được một. Net Core thực hiện mã hóa Rijndael hoặc AES được thêm vào như là một tham chiếu đến một dự án Thư viện lớp Net mới.

Dưới đây là phương pháp Mã hóa mà làm việc trong .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

vấn đề trong NET cốt lõi là gì? Thư viện có bị thiếu không? –

+2

Có vẻ như nó đang trên lộ trình cho bản phát hành 1.1: https://github.com/dotnet/corefx/issues/9984 –

+0

Nate chính xác, vấn đề chính dường như là việc triển khai Rijndael bị thiếu trong tham chiếu Mật mã trong hiện tại phát hành .Net Core ... chỉ cần triển khai các lớp cơ sở trừu tượng. – Ensunder

Trả lời

19

Sự khác biệt (trong .NET) giữa Rijndael và AES là Rijndael cho phép kích thước khối để thay đổi, nhưng không AES không phải. Vì kích thước khối mặc định của RijndaelManaged giống với kích thước khối AES (128 bit/16 byte), thực ra bạn đang sử dụng AES.

Thay vì khởi tạo loại triển khai theo tên, chỉ cần sử dụng nhà máy (Aes.Create()). Điều đó hoạt động ở cả .NET Core và .NET Framework.

Những điều khác đáng nói:

  • trường Tất cả SymmetricAlgorithm là IDisposable, bạn nên sử dụng chúng trong một tuyên bố using.
  • Tất cả các phiên bản ICryptoTransform (chẳng hạn như tên không chính xác desEncryptor) của bạn là IDisposable, bạn nên sử dụng chúng trong câu lệnh using.
  • Đệm ISO10126 không khả dụng trong .NET Core 1.0. Nếu bạn cần tương thích với các luồng hiện tại, bạn có thể áp dụng padding cho mình và chỉ định PaddingMode.None. Nếu không, PKCS7 là tiêu chuẩn hơn.
  • Khóa AES của bạn không phải là rất ngẫu nhiên, vì nó đến từ một chuỗi ASCII (rất nhiều giá trị sẽ không hợp lệ).
    • Base64 ít nhất có phạm vi giá trị đầy đủ
    • PBKDF2 (Password-Based chính thức chiết khấu Chức năng 2) thông qua Rfc2898DeriveBytes lớp cho phép chia sẻ-string-bí mật trong, tiếng ồn có thể dự đoán ra.
    • KeyAgreement nói chung là tốt hơn, nhưng không phải ECDH cũng như DH cổ điển đều có sẵn trong .NET Core 1.0.
  • Thông thường, bộ mã hóa nên cho phép tính toán ngẫu nhiên IV (gọi aes.GenerateIV() nếu sử dụng cùng một đối tượng cho nhiều thao tác) và trình bày nó với bản mã. Vì vậy, mã hóa có một khóa và bản rõ và tạo ra một bản mã và IV. Giải mã mất (khóa, IV, bản mã) và tạo bản rõ.
+0

bartonjs: xin lỗi nếu đây là một câu hỏi ngu ngốc, nhưng tôi đã cố gắng để tìm kiếm làm thế nào để làm điều đó ... làm thế nào tôi sẽ tự áp dụng các padding ISO10126? Chúng tôi cần phải tương thích với các luồng hiện có. – Ensunder

+0

Mở rộng mảng để được căn chỉnh khối (thêm khối khác nếu đã có) và điền vào mỗi https://en.wikipedia.org/wiki/Padding_(cryptography)#ISO_10126. Nếu bạn đang sử dụng các luồng, bạn có thể lấy nó vào một mảng hoặc tạo một ICryptoTramsform tùy chỉnh để bọc dòng hiện tại và áp dụng/loại bỏ phần đệm trong TransformFinalBlock. (Biến đổi tùy chỉnh cũng sẽ làm việc cho các byte trực tiếp, tất nhiên). – bartonjs

+0

Khi sử dụng CFB với NoPadding. CreateEncryptor được tạo ra từ Aes không thể có InputBlockSize == 1. RijndaelManaged không có vấn đề này. – Diryboy

0

Nếu bạn chỉ muốn mã hóa/giải mã nội dung, tránh sử dụng Rijndael trực tiếp vì lõi asp.net có nhiều trình bao bọc đẹp hơn dễ sử dụng hơn và có nhiều khả năng được bảo mật theo mặc định. Nó được gọi là 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}"); 

Xem data protection docs để biết thêm thông tin

Các vấn đề liên quan