2012-02-10 36 views
7

Tôi đã sau mã trong C#C# PasswordDeriveBytes Lẫn lộn

PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations); 
byte[] KeyBytes = DerivedPassword.GetBytes(32); 

Tôi đang sử dụng "SHA1" băm thuật toán.

Theo định nghĩa SHA1, nó tạo khóa 160 bit (20 byte). Câu hỏi của tôi là cách GetBytes nhận được 32 byte từ DerivedPassword, thuật toán nào được sử dụng sau phương thức GetBytes?

Trả lời

11

thi hành PKCS # 5 gốc (aka PBKDF1) của Microsoft bao gồm không an toàn phần mở rộng để cung cấp byte hơn các hàm băm có thể cung cấp (xem báo cáo lỗi herehere).

Thậm chí nếu nó không được buggy bạn nên tránh không có giấy tờ, mở rộng độc quyền tiêu chuẩn (hoặc bạn có thể không bao giờ có thể giải mã dữ liệu của bạn trong tương lai -. Ít nhất là không bên ngoài Windows)

tôi mạnh đề nghị bạn sử dụng Rfc2898DeriveBytes mới hơn để triển khai PBKDF2 (PKCS # 5 v2) có sẵn từ .NET 2.0.

4

thuật toán nào được sử dụng sau phương pháp GetBytes?

Sử dụng thuật toán PBKDF1, được sửa đổi một chút để cho phép độ dài khóa tùy ý. Một lớp thay thế, Rfc2898DeriveBytes sử dụng PBKDF2.

Bạn có thể đọc số Wikipedia Article on PBKDF2 để biết ý tưởng chung về khái niệm cơ bản đang tạo ra tác phẩm này.

+0

Phương thức này bắt nguồn 32 byte từ 20 byte (thuật toán băm 'SHA1' được tạo). – Siddiqui

+0

@Siddiqui @ 'HenrickHellstrom giải thích nó độc đáo. – vcsjones

4

Chức năng dẫn xuất khóa sử dụng tính năng được gọi là Kéo dài khóa. (Đừng bận tâm tìm kiếm nó trên Wikipedia, vì bài viết hiện tại gây nhầm lẫn khái niệm với Tăng cường khóa, điều này hoàn toàn khác.)

Kéo dài khóa thường được thực hiện bằng cách áp dụng PRF (chẳng hạn như hàm băm hoặc thuật toán mã hóa) ở chế độ CTR hoặc bằng cách lặp lại và ghép nối các đầu ra trung gian. Ví dụ, nếu bạn sử dụng quy trình CTR, SHA-1 là PRF và muốn 32 byte đầu ra giả ngẫu nhiên, bạn nối SHA1 (khóa chính, 0) với 12 byte đầu tiên của SHA1 (keymaterial, 1).

+0

cảm ơn bạn đã phát lại, bạn có thể cho tôi thêm chút giải thích về quy trình CTR không. – Siddiqui

+1

Trong trường hợp này, các số 0 và 1 có thể được biểu diễn bằng một bit (nhớ SHA-1 hoạt động trên các chuỗi bit như đầu vào), nhưng thường (keymaterial, 0) vv được định nghĩa là ví dụ: (a) keymaterial với một byte đơn (hoặc từ) 0 được thêm vào cuối, hoặc (b) khối đầu vào 64 byte đầy đủ với keymaterial đầu tiên, một số đệm (thường là byte có giá trị bằng 0) và một byte có giá trị 0 tại kết thúc. –