2010-12-02 3 views
0
96

후 잘못된 바이트를 생성하는 코드입니다순차 .NET DESCryptoServiceProvider 암호화 및 암호 해독 여기, 기본적으로

 DES des = new DESCryptoServiceProvider(); 
     PasswordDeriveBytes pdb = new PasswordDeriveBytes(new byte[]{123}, new byte[0]); 
     des.IV = new byte[8]; 
     des.Key = pdb.CryptDeriveKey("DES", "MD5", 0, des.IV); 

     byte[] A = Enumerable.Range(1, 100).Select(i => (byte)i).Concat(new byte[4]).ToArray(); 
     byte[] B = new byte[A.Length]; 
     byte[] C = new byte[A.Length]; 

     using (var encryptor = des.CreateEncryptor()) 
      encryptor.TransformBlock(A, 0, A.Length, B, 0); 

     using (var decryptor = des.CreateDecryptor()) 
      decryptor.TransformBlock(B, 0, B.Length, C, 0); 

     for (int i = 0; i < A.Length; i++) 
      if (A[i] != C[i]) 
       Debugger.Break(); 

그것은 i == 96에서 휴식. 왜?

또 다른 작은 질문 : .Concat(new byte[4])을 생략하면 첫 번째 TransformBlock이 ArgumentException을 throw합니다. 결국 4 개의 0이없는 정렬 된 바이트 배열을 암호화 할 수없는 이유는 무엇입니까?

답변

1

DES는 64 비트 블록의 블록 사이퍼이므로 인코딩 할 데이터는 64 비트 블록의 배수 여야합니다. (http://en.wikipedia.org/wiki/Data_Encryption_Standard 참조)

96을 보면, 마지막 블록이 104 (64 비트 블록)에 100을 채우고 있지만 그 마지막 값을 설정하고 있지 않다는 사실을 기반으로 다른 블록이 있다고 가정합니다. 이 도움이 0

희망,

+0

고마워요! 따라서 솔루션은 8 개의 0 바이트를 인코딩 한 다음 결과를 자르는 것으로 보입니다. –

0

실제 솔루션 4 바이트 ITransform.TransformFinalBlock를 사용하는 것입니다.

관련 문제