2011-09-13 61 views
16

Tôi cần triển khai mã hóa/giải mã AES 256 và tôi không thể tìm thấy ví dụ hoạt động chính xác.C# Ví dụ về mã hóa AES256 bằng System.Security.Cryptography.Aes

MSDN cho thấy rằng tôi nên sử dụng lớp AES.

Lớp Rijndael là tiền thân của thuật toán Aes. Bạn nên sử dụng thuật toán Aes thay vì Rijndael. Để biết thêm thông tin, hãy xem mục nhập The Differences Between Rijndael and AES trong blog Bảo mật .NET.

Bất kỳ ai có thể chỉ cho tôi theo hướng ví dụ tốt bằng cách sử dụng lớp AES cho AES256?

Để thêm một chút rõ ràng hơn:

Tôi có một tập tin mật mã có chứa chìa khóa chia sẻ và một chuỗi văn bản được mã hóa. Tôi cần phải giải mã văn bản và sau đó xác nhận nó.

Tất cả các ví dụ tôi đã thấy mong đợi ít nhất 2 tham số để thực hiện mã hóa/giải mã.

Tôi có thể suy ra vectơ khởi tạo và khóa từ văn bản trong tệp mã hóa không?

Đây là một ví dụ về văn bản tổ chức trong tập tin mật mã của tôi:

EUA ± Ira ƒ @ † ²; A; öDWnªóª ©© ¨|L

+4

Các tài liệu cho cả hai [AesManaged] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged .aspx) và [AesCryptoServiceProvider] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.aescryptoserviceprovider.aspx) lớp cung cấp các ví dụ phức tạp. Nếu các ví dụ không hoạt động theo cách bạn mong đợi, vui lòng đăng một chương trình ngắn nhưng đầy đủ để chứng minh sự cố. – dtb

+0

@dtb Cảm ơn. Tôi đã không phát hiện ví dụ trong AesManaged vì điều này chỉ có sẵn cho .Net 4 và tôi hiện đang sử dụng 3.5 nhưng ví dụ trông thẳng về phía trước. – TeamWild

+0

Để giải mã dữ liệu, bạn cần phải biết chế độ mã hóa trực tiếp ban đầu được mã hóa với (thường là CBC hoặc ECB). ECB không có vector khởi tạo. Nếu CBC được sử dụng, thì một vài byte đầu tiên của dữ liệu được mã hóa có thể là IV. Vui lòng cung cấp tất cả thông tin bạn có và gửi mẫu hoàn chỉnh hợp lệ (dữ liệu kez và mã hóa). Vì dữ liệu được mã hóa là nhị phân, bạn sẽ phải đăng nó mã hóa Base 64 hoặc trong một biểu diễn hệ thập lục phân. – Codo

Trả lời

3

Một khi tôi đã phát hiện ra tất cả các thông tin về cách khách hàng của tôi đã được xử lý mã hóa/giải mã ở cuối của họ đó là thẳng về phía trước bằng cách sử dụng AesManaged example được đề xuất bởi dtb.

Mã cuối cùng thực hiện bắt đầu như thế này:

try 
    { 
     // Create a new instance of the AesManaged class. This generates a new key and initialization vector (IV). 
     AesManaged myAes = new AesManaged(); 

     // Override the cipher mode, key and IV 
     myAes.Mode = CipherMode.ECB; 
     myAes.IV = new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // CRB mode uses an empty IV 
     myAes.Key = CipherKey; // Byte array representing the key 
     myAes.Padding = PaddingMode.None; 

     // Create a encryption object to perform the stream transform. 
     ICryptoTransform encryptor = myAes.CreateEncryptor(); 

     // TODO: perform the encryption/decryption as required... 

    } 
    catch (Exception ex) 
    { 
     // TODO: Log the error 
     throw ex; 
    } 
+0

Tôi sẽ không khuyên bạn sử dụng chế độ mã hóa ECB. Sử dụng CBC hoặc cái gì khác.Nếu bạn cần biết tại sao, hãy xem Điều Wikipedia này: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation. Ngoài ra, đây là một ví dụ tốt về cách thực hiện mã hóa với AES trong C#: https://github.com/jbubriski/Encryptamajig –

+0

IV của bạn cũng phải được ngẫu nhiên, mỗi lần bạn mã hóa dữ liệu khác nhau. Bạn cũng đang tham chiếu chế độ CRB trong chú thích ... –

+1

@JohnBubriski - Bên thứ ba đã cung cấp tệp được mã hóa được nhấn mạnh vào việc sử dụng chế độ mã hóa và IV. Tôi hiểu đó không phải là cách bạn nên làm nhưng đó là trường hợp "Fit in or F ** k off". – TeamWild

8

Có lẽ ví dụ này được liệt kê here có thể giúp bạn. Tuyên bố từ tác giả

khoảng 24 dòng mã để mã hóa, giải mã 23 đến