私はMeet-in-the-Middle攻撃を実装しようとしていますが、それをテストするために、値のハードコーディングを行いました。これは単純なコードのこのブロックです。
byte[] key1 = new byte[] { 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte[] key2 = new byte[] { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
string p1 = "Hello Dear World";
string p2 = "Hello Evil World";
//SimpleDES is just a C# implementation of DES that I've wrapped in its own class
SimpleDES des1 = new SimpleDES(key1);
SimpleDES des2 = new SimpleDES(key2);
byte[] toEncrypt1 = Encoding.ASCII.GetBytes(p1);
c1 = Convert.ToBase64String(des2.Encrypt(des1.Encrypt(toEncrypt1)));
byte[] toEncrypt2 = Encoding.ASCII.GetBytes(p2);
c2 = Convert.ToBase64String(des2.Encrypt(des1.Encrypt(toEncrypt2)));
誰かから要求されない限り、これ以上コードは省略します。
問題は、上記の単純なテストキーとテストプレーンテキストを考えると、key1で暗号化してからkey2で暗号化すると同じ暗号文を生成するいくつかの異なるキーペアを取得していることです。
これまでに述べたことから、それを説明する明らかな何かがありますか、それともブルートフォースコードを詳しく調べる必要がありますか。
使用している短いキーが原因ですか?
暗号の場合、各キーは異なる順列を定義しますが、それは同一の1:1関係が存在できないことを意味するものではありません。 256ビットキーを使用して2 ^ 128値を別の2 ^ 128値にマップするAES-256を使用し、1つの16バイトの平文(すべてゼロ)を暗号化します。出力にも2 ^ 128の値があります。したがって、同じ平文を同じ暗号文にマップするキーが必要です。
それはおそらくあなたを噛んでいるものではありません。 DESキーには、各バイトの下位ビットであるパリティビットがあります。このビットにより、バイトのビット数が常に奇数になります。実装では、パリティビットを無視することを選択できます。パリティに関してのみ異なるキーがある場合、サブキーの導出に使用されるキー値は同じです。したがって、各バイトの最上位7ビットのみが重要であり、DES 64-8のビットサイズ= 56ビット。