2017-11-22 29 views
2

こんにちは私は暗号化/復号化の部分を学んでいます。私はAES 128ビットを使用してECB暗号モードとPKCS7パディングを使用する暗号化/復号化の2つの方法を作成しました。ECB暗号モードアルゴリズムを使用するAES 128ビットは、無効なキーで正しく復号化されますか?

以下はコードです。

public class EncClass 
    { 
     public string Encrypt(string text) 
     { 

      byte[] src = Encoding.UTF8.GetBytes(text); 
      byte[] key = Encoding.ASCII.GetBytes("contactcentre"); 
      RijndaelManaged aes = new RijndaelManaged(); 
      aes.Mode = CipherMode.ECB; 
      aes.Padding = PaddingMode.PKCS7; 
      aes.KeySize = 128; 

      using (ICryptoTransform encrypt = aes.CreateEncryptor(key, null)) 
      { 
       byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length); 
       encrypt.Dispose(); 
       return Convert.ToBase64String(dest); 
      } 
     } 

     public string Decrypt(string text) 
     { 

      byte[] src = Convert.FromBase64String(text); 
      RijndaelManaged aes = new RijndaelManaged(); 
      byte[] key = Encoding.ASCII.GetBytes("contactcentrT"); 
      aes.KeySize = 128; 
      aes.Padding = PaddingMode.PKCS7; 
      aes.Mode = CipherMode.ECB; 
      using (ICryptoTransform decrypt = aes.CreateDecryptor(key, null)) 
      { 
       byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length); 
       decrypt.Dispose(); 
       return Encoding.UTF8.GetString(dest); 
      } 
     } 
    } 

暗号化して、私はcontactcentreキーに合格したと復号に私はcontactcentrTに合格していることに注意してください。その場合、適切な暗号化と復号化を行っています。

var encString = encClass.Encrypt(@"manoj"); 
    var decString = encClass.Decrypt(encString); 

私の両キーは一致していませんが、それでも正しく動作しています。これがどうして起こるか知りたかっただけですか?

答えて

1

無効なキーをaes.CreateEncryptor(およびCreateDecryptor)に渡しています。 AESの有効なキーサイズは128,192,256で、キーは13 * 8 = 104ビットです。 aes.Keyに割り当てようとすると例外がスローされます。しかし、aes.CreateEncryptorにはバグがあり、「キーサイズは128,192、または256ビットでなければならない」という文書に明示されているにもかかわらず、キーサイズがブロックサイズ(128ビット未満)未満の場合、キーサイズが正しく検証されません。このバグは、コードに対して例外を正しくスローする方法(少なくともバージョン2では)によって.NET Coreで修正されています。

無効な鍵を渡しているので、誤ってCreateEncryptorが許可されているため、あなたは本当にAESで暗号化されておらず、何かが起こる可能性があります。たとえば、1バイト(または2、または7)のキーを渡すと、範囲外のインデックス例外がスローされます。私の前提(ソースコードを見て)はアルゴリズムの実装で、バイト単位のキーサイズが4で割り切れると仮定し、それらの4バイトブロックを使用します。 4バイトブロックの数はkeySize/4(および13/4 = 3)と計算されるため、キーの最初の12文字は同じで残り(1,2,3文字)は使用されません。

とにかく、アルゴリズムが無効な入力で実行され、それを行うことによって生成された結果が無関係であるため、なぜこのようなことが起こるかについては何の仮定もありません。

その情報を考える - 決してaes.CreateEncryptorに直接鍵を渡していないが、実装は、キーのいずれかのキーが生成される異なると異なる暗号化されたデータになります使用している場合はその(aes.CreateEncryptor(aes.Key, iv)

+0

を渡し、その後aes.Key最初にそれを割り当て、 。キーがまったく使われていないと言っていますか?それでは、どんな鍵が使われていますか? – zaph

+0

@zaph aes.CreateEncryptorにはバグがあり、128ビット未満のサイズのキー(これはAESにとって無効なキーです)を許可します。いくつかのそのようなキーでは例外をスローし、OPキーのように他のものに対しては無効なキーでアルゴリズムを実行します。その場合に何かが起こる可能性があります。私は答えで起こっているかもしれないと思っていることを述べましたが、それは問題ではありません。無効なキーでAESを実行するのは間違っており、それによって生成されたものは無関係のゴミではありません。 – Evk

+0

無効なキーを使用すると不明な結果が得られ、KDFを使用する必要があることに同意します。まだここには何か他のことがあります。 OPはサンプル出力を提供していない。保証で行うことができる唯一の答えは、正しいサイズのキーを使用することです。他のすべては推測しており、その質問には適用されない情報があります。 – zaph

関連する問題