3

저는 암호화 및 .NET 프레임 워크에 익숙해지고 있습니다. 많은 예제를 살펴본 후에 .NET 클래스 Rfc2898DeriveBytes을 사용할 때 혼란스럽게 반복되는 패턴을 보게됩니다. 이 클래스를 사용하여 암호화 키와 초기화 벡터를 얻는 경우 같은 방법이 사용 된 것 같습니다.Rfc2898DeriveBytes 클래스를 사용하여 키 및 IV 가져 오기

여기 키와 초기화 벡터를 얻는 것을 보여주는 MSDN blog의 코드가 있습니다.

byte[] salt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; 
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes("[email protected]$$w0rd", salt, 1000); 

// generate an RC2 key 
byte[] key = pwdGen.GetBytes(16); 
byte[] iv = pwdGen.GetBytes(8); 

다른 장소에서도 이걸 사용했습니다. 나는 이것이 다음과 같이 될 것이라고 생각했을 것입니다 ...

// generate an RC2 key 
byte[] key = pwdGen.GetKey(); 
byte[] iv = pwdGen.GetInitializationVector(); 

나는 여기에 뭔가를 놓치고 있어야합니다. 키 및 초기화 벡터 (IV)가 임의의 숫자 일 경우 적절한 암호와 소금을 사용할 때 다시 얻는 방법은 무엇입니까?

답변

4

RFC2898 키 유도 알고리즘은 결정적입니다. 동일한 입력으로 실행하면 동일한 출력을 얻게됩니다.

동일한 순서로 GetBytes()을 호출하는 경우 동일한 바이트 수를 요청하면 동일한 키와 IV가 표시됩니다.

실제 시스템에서 소금은 암호화 시간에 무작위로 생성되어야하며 (암호 해독시 검색 될 수 있도록 저장되어야 함) 잊지 마십시오.

+0

Key와 IV는 같은 방법으로 파생 된 경우 어떻게 다른가요? 얼마나 많은 바이트가 매개 변수에 전달되어야 하는지를 어떻게 알 수 있습니까? – webworm

+1

@webworm : 첫 번째'GetBytes (16)'호출은 알고리즘 출력의 바이트 0에서 15를 반환하고, 두 번째'GetBytes (8)'호출은 출력의 바이트 16에서 23을 반환합니다. 키 크기와 IV 크기가 알고리즘, 암호 모드 및 구현 선택에 의해 결정되기 때문에 바이트 수를 알 수 있습니다. – caf

+0

임의의 소금 또는 임의의 암호이지만 일정한 소금을 사용하여 암호에서 IV를 추출하는 것이 중요합니까? –