一部のデータを暗号化するためにpyDesを使用しています。キーや初期値を 1 ビットでも変更すると、暗号化されたデータがまったく異なるものになることを実証したかったのです。最後の文字を +/- 1 だけ変更するように 16 バイトのキーを設定しました。これにより、少なくとも 1 ビットが異なることになります。ただし、それを行っても、暗号化されたデータの 3 つの異なるインスタンスがすべて異なるわけではありません。
from pyDes import *
data = 'Hello'
# CBC : Cipher-Block-Chaining
# \0..\1: arbitrary initial value for CBC
# pad=None: let pyDes take care of padding bytes
k1 = triple_des("16-byte-key-here", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5)
k2 = triple_des("16-byte-key-herf", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5)
k3 = triple_des("16-byte-key-herd", CBC, "\0\0\0\0\0\0\0\1", pad=None, padmode=PAD_PKCS5)
d1 = k1.encrypt(data)
d2 = k2.encrypt(data)
d3 = k3.encrypt(data)
assert d1 != d2
assert d2 != d3
assert d1 != d3
キーまたは初期値のいずれかを少し変更しただけでは、アサーションの 1 つが失敗するようです。私は両方を見てきd1 != d2
ましd1 != d3
たが、変更内容によっては失敗します。また、入力データが短すぎるだけではないことを確認するために、に変更しようとし'Hello'
ました。'Hello' * 50
完全にランダムなキーを作成すると、アサーションはパスします。上記のプログラムでは、d1 != d3
失敗します (これらのキーは 1 ビット離れており、k1-k2 は 2 ビット異なります)。
私は決して暗号化の専門家ではありませんが、1 ビットしか離れていない 2 つのキーが同じ暗号化されたデータになる場合、それは、キーをブルート フォースするために必要な労力が 2 分の 1 になったことを意味します。
明らかな何かが欠けていますか?トリプル DES は、非常によく似たキーに対して一意の結果を与えることは想定されていませんか? それとも、これは PyDes のバグですか? 他の誰かが別の実装でこの動作を確認できるでしょうか?
@Chris Jester-Young は、キーの一部のビットがパリティ ビットであるという回答を持っていました。そして、結局のところ、この記事によると:
DES の入力キーの長さは 64 ビットですが、DES で使用される実際のキーの長さはわずか 56 ビットであることに注意してください。各バイトの最下位 (右端) ビットはパリティ ビットであり、すべてのバイトに奇数個の 1 が常に存在するように設定する必要があります。これらのパリティ ビットは無視されるため、各バイトの最上位 7 ビットのみが使用されるため、キーの長さは 56 ビットになります。これは、トリプル DES の有効なキー強度が実際には 168 ビットであることを意味します。これは、3 つのキーのそれぞれに、暗号化プロセス中に使用されない 8 つのパリティ ビットが含まれているためです。
(強調は私のものでした)
そして、これらのパリティ ビットは、まさにこの例で変更していたビットです。
ありがとうクリス!