web-dev-qa-db-ja.com

double DES)の平文/暗号文のペアで複数のキーの一致を取得する

私は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
DSF

暗号の場合、各キーは異なる順列を定義しますが、それは同一の1:1関係が存在できないことを意味するものではありません。 256ビットキーを使用して2 ^ 128値を別の2 ^ 128値にマップするAES-256を使用し、1つの16バイトの平文(すべてゼロ)を暗号化します。出力にも2 ^ 128の値があります。したがって、同じ平文を同じ暗号文にマップするキーが必要です。

それはおそらくあなたを噛んでいるものではありません。 DESキーには、各バイトの下位ビットであるパリティビットがあります。このビットにより、バイトのビット数が常に奇数になります。実装では、パリティビットを無視することを選択できます。パリティに関してのみ異なるキーがある場合、サブキーの導出に使用されるキー値は同じです。したがって、各バイトの最上位7ビットのみが重要であり、DES 64-8のビットサイズ= 56ビット。

2
Maarten Bodewes