2012-02-10 1 views
7

전 C# 코드를 다음했다.C#을 PasswordDeriveBytes 혼란

SHA1 정의에 따르면, 해당 키는 160 비트 (20 바이트)의 키를 생성합니다. 내 질문에 GetBytes 메서드 DerivedPassword에서 32 바이트 GetBytes 메서드 뒤에 어떤 알고리즘을 사용하는 방법입니다?

답변

11

원래 PKCS # 5 (일명 PBKDF1)의 마이크로 소프트의 구현은 제공 (버그 리포트 herehere 참조) 할 수있는 해시 함수보다 더 많은 바이트를 제공하기 위해 불안 확장을 포함한다. 당신이 표준에 문서화되지 않은, 독점 확장을하지 않도록해야 버그가되지 않았다 (또는 나중에 데이터를 해독 할 수 없을 수도 있습니다. - 적어도 윈도우 외부)

하더라도

을 나는 강하게 제안 .NET 2.0 이후에 사용 가능한 PBKDF2 (PKCS # 5 v2)를 구현하는 최신 Rfc2898DeriveBytes을 사용합니다.

4

GetBytes 메서드 뒤에 어떤 알고리즘이 사용 되었습니까?

임의의 키 길이를 허용하도록 약간 수정 된 알고리즘 PBKDF1을 사용합니다. 대체 클래스 Rfc2898DeriveBytes은 PBKDF2를 사용합니다.

Wikipedia Article on PBKDF2을 보면 어떤 기본 개념이이 작업을하고 있는지 알 수 있습니다.

+0

이 방법은 20 바이트에서 32 바이트 ('SHA1'해싱 알고리즘이 생성 됨)를 도출합니다. – Siddiqui

+0

@Siddiqui @'HenrickHellstrom이 친절하게 설명했습니다. – vcsjones

4

키 유도 함수는 키 스트레칭이라는 기능을 사용합니다. (현행의 기사에서는 개념이 완전히 다른 무언가 인 Key Strengthening과 혼동하기 때문에 Wikipedia에서 그것을보고 귀찮게하지 마십시오.)

키 스트레칭은 일반적으로 해시 함수 나 암호)를 CTR 모드로 보내거나 반복하여 반복하고 중간 출력을 연결합니다.

예를 들어 CTR 절차 인 SHA-1을 PRF로 사용하고 32 바이트의 의사 임의 출력을 원하면 SHA1 (keymaterial, 0)을 SHA1 (keymaterial, 1)의 처음 12 바이트와 연결하십시오.

+0

재생 해 주셔서 감사합니다. CTR 절차에 대해 더 자세히 설명해 주시겠습니까? – Siddiqui

+1

이 경우, 숫자 0과 1은 단일 비트로 표현 될 수 있지만 (SHA-1이 비트 열을 입력으로 처리한다는 것을 기억하십시오.) 일반적으로 (키 재료, 0) 등은 예를 들어. (a) 마지막에 단일 바이트 (또는 단어) 0이 추가 된 키 머티리얼 또는 (b) 키 머티리얼이 먼저있는 전체 64 바이트 입력 블록, 일부 패딩 (일반적으로 값이 0 인 바이트) 및 값 0 인 단일 바이트 끝. –