2011-11-07 9 views
1

重要な部分が欠落:AES暗号化...このようになります私は、静的な暗号化クラスのメソッドを持って

[TestMethod] 
    public void EncryptStringEncryptsTest() 
    { 
     var toEncrypt = "My text to encrypt"; 
     var encryptionKey = Convert.FromBase64String("93mcgv9UBYpwgoUX0AXEaU1BqTCufPWPkFdOdoILLDA="); 
     var encrypted = Encryption.EncryptString(toEncrypt, encryptionKey); 

     var text = Convert.ToBase64String(encrypted); 
     Assert.IsTrue(false); 
    } 

public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey) 
    { 
     var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt); 
     using (var provider = new AesCryptoServiceProvider()) 
     { 
      provider.Key = encryptionKey; 
      provider.Mode = CipherMode.ECB; 
      provider.Padding = PaddingMode.ISO10126; 
      using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV)) 
      { 
       using (var ms = new MemoryStream()) 
       { 
        using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
        { 
         cs.Write(toEncryptBytes, 0, toEncryptBytes.Length); 
         cs.FlushFinalBlock(); 
        } 
        return ms.ToArray(); 
       } 
      } 
     } 
    } 

私はこのようになりますユニットテストを持っていますこれを実行するたびに、text値が変更されます。同じ入力があれば、私はそれが一定であると期待します。それを期待して間違っているのですか、何か間違っていますか?

+0

ECBは安全ではありません。 – SLaks

+0

このコンテキストで「安全でない」と定義してください。モードを変更した場合、コードを変更する必要がありますか?私はほとんど常にハッシュを使用するので、対称リバーシブル暗号化は弱点があることを認めなければなりません。 –

+0

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 – SLaks

答えて

2

あなたの前提は正しくありません。

ISO10126 paddingは、ブロックサイズの倍数にメッセージを埋め込むためにランダムなデータを追加します。

+0

すべてが理解されていることを確認するだけで、埋め込みの最後のバイトはランダムではありませんが、埋め込みバイト数(リンクされた例では07h)をエンコードします。残りのバイトは実際には指定されていません。*ランダムでもかまいませんが、リンクされている必要はありません。最後に、パディングのビットのいずれかが変更された場合、暗号文の最後の完全ブロック(DES/3DESの場合は8バイト、AESの場合は16バイト)が変更されます。 –

+0

ああ、1バイトのパディング(最小)がある場合、長いパディングにランダムなバイトが使用されても、結果は常に同じになります。 –

1

ISO10126ごとにランダムなパディングバイトを使用しています。したがって、すべての入力が同じであっても、結果は毎回同じではありません。

+2

面白いことに、実装者がISO10126を実装するためにPKCS#5のパディングを使用できるのと同じかもしれません。バイトはランダム*ではありません。つまり、テストは作成したプラットフォームで正常に実行され、別のプラットフォームでは失敗する可能性があります。暗号は面白くないのですか? –