2010-12-02 11 views
0

後に間違ったバイトを生成し、基本的に、ここでのコードは次のとおりです。シーケンシャル.NET DESCryptoServiceProviderの暗号化と復号化は、第96

 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で壊れます。どうして?

もう1つの小さな質問:.Concat(new byte[4])を省略すると、最初のTransformBlockがArgumentExceptionをスローします。最後にソートされたバイトの配列を4つゼロで暗号化できないのはなぜですか?

答えて

1

DESは64ビットブロックのブロックサイファーであるため、エンコードするデータは64ビットブロックの倍数である必要があります。 (http://en.wikipedia.org/wiki/Data_Encryption_Standard

96を見ると、最後のブロックは104(64ビットブロック)に100(64ビットブロックではない)を埋め込んでいるが、最後のブロックの値を設定していないという事実に基づいて、このことができます0

ホープ、

+0

ありがとうございました!したがって、解決策は8バイト以上のゼロバイトをエンコードし、結果をトリミングするようです。 –

0

実際の溶液に4バイトITransform.TransformFinalBlockを使用することです。