2012-02-10 7 views
7

Mam następujący kod w C#C# PasswordDeriveBytes Confusion

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

używam "SHA1" mieszania algorytmu.

Zgodnie z definicją SHA1, generuje 160-bitowy klucz (20 bajtów). Moje pytanie brzmi: w jaki sposób metoda GetBytes pobiera 32 bajty z DerivedPassword, jaki algorytm zastosowano w metodzie GetBytes?

Odpowiedz

11

wdrożenie Microsoft oryginału PKCS # 5 (aka PBKDF1) obejmują niebezpieczne rozszerzenia zapewniające więcej bajtów niż funkcja skrótu może dostarczyć (patrz raporty o błędach here i here).

Nawet jeśli nie był dziurawy należy unikać nielegalnych, własnych rozszerzeń do normy (lub nigdy nie może być w stanie do odszyfrowania danych w przyszłości. - przynajmniej nie na zewnątrz Windows)

I silnie sugerować możesz użyć nowszego Rfc2898DeriveBytes, który implementuje PBKDF2 (PKCS # 5 v2), który jest dostępny od .NET 2.0.

4

jaki algorytm zastosowano w metodzie GetBytes?

Wykorzystuje algorytm PBKDF1, który jest nieznacznie zmodyfikowany, aby umożliwić dowolną długość klucza. Klasa zamienna, Rfc2898DeriveBytes, wykorzystuje PBKDF2.

Możesz przeczytać Wikipedia Article on PBKDF2, aby uzyskać ogólne pojęcie o tym, jakie koncepcje sprawiają, że to działa.

+0

Jak ta metoda wyprowadziła 32 bajty z 20 bajtów (wygenerowany algorytm mieszający "SHA1"). – Siddiqui

+0

@Siddiqui @ 'HenrickHellstrom wyjaśnił to ładnie. – vcsjones

4

Funkcja wyprowadzenia klucza wykorzystuje funkcję o nazwie Kluczowe rozciąganie. (Nie zawracaj sobie głowy wyszukiwaniem w Wikipedii, ponieważ obecny artykuł myli koncepcję z kluczowym wzmocnieniem, co jest czymś zupełnie innym.)

Kluczowe rozciąganie jest zwykle wykonywane przez zastosowanie PRF (takiego jak funkcja skrótu lub cipher) w trybie CTR lub przez iterację i konkatenację wyjść pośrednich.

Na przykład, jeśli używasz procedury CTR, SHA-1 jako PRF i chcesz 32 bajty pseudo losowego wyniku, łącz się SHA1 (keymaterial, 0) z pierwszymi 12 bajtami SHA1 (keymaterial, 1).

+0

dzięki za powtórkę, możesz dać mi trochę więcej wyjaśnień na temat procedury CTR. – Siddiqui

+1

W tym przypadku liczby 0 i 1 mogą być reprezentowane przez pojedynczy bit (pamiętaj, że SHA-1 operuje na łańcuchach bitów jako danych wejściowych), ale zwykle (keymaterial, 0) itp. Jest zdefiniowany jako np. (a) keymaterial z jednym bajtem (lub słowem) 0 dołączonym na końcu, lub (b) pełnym 64-bajtowym blokiem wejściowym z pierwszym keymaterialem, niektórymi paddingami (zwykle bajtami o wartości zero) i pojedynczym bajtem o wartości 0 at koniec. –