私はいくつかのデータを暗号化するためにpyDesを使用しています。キーまたは初期値で1ビットも変更すると、暗号化されたデータはまったく異なることを実証したかったのです。最後の文字を+/- 1に変更するために16バイトのキーを設定し、少なくとも1つのビットを異ならせます。しかし、私がそうしたとしても、暗号化されたデータの3つのインスタンスがすべて異なるわけではありません。アサーションのトリプルDESキーまたは初期値の1ビットを変更すると、異なる暗号化データが得られないのはなぜですか?
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
一つは、私が唯一のキーまたは初期値のいずれかに小さな変更を加える場合に失敗するようです。私はd1 != d2
とd1 != d3
の両方が私が何を変えるかによって失敗するのを見ました。私はまた、'Hello'
を'Hello' * 50
に変更しようとしましたが、入力データが短すぎるということだけではないことを確認しました。
完全にランダムなキーを作成すると、アサーションは成功します。上記のプログラムでは、d1 != d3
が失敗します(それらのキーは1ビット離れています; k1-k2は2ビット異なります)。
私は決して暗号化エキスパートではありませんが、1ビットだけ離れた2つのキーが同じ暗号化データを生成する場合は、ブルートフォースに要した労力が2倍になり、右?
明らかなものがありませんか?トリプルDESは、非常に似たキーに対してユニークな結果を出すものではありませんか?これはPyDesのバグですか?誰か他の人がこの動作を別の実装で確認できるのでしょうか?
@Chris Jester-Youngは、キーの一部のビットがパリティビットであるという答えを出しました。 this article:
DESの入力キーは64ビットですが、DESが使用する実際のキーの長さは56ビットにすぎないことに注意してください。各バイトの最下位ビット(最右端)はパリティビットであり、常に1バイトごとに1の奇数が存在するように設定する必要があります。これらのパリティビットは無視されるため、各バイトの7つの最上位ビットのみが使用され、56ビットのキー長が得られます。 これは、トリプルDESの実効キー強度が実際には168ビットであることを意味します。これは、3つのキーのそれぞれに、暗号化プロセスで使用されない8個のパリティビットが含まれているためです。
(強調は私だった)
そして、それらのパリティビットは、私が例で変更された正確にビットでした。
おかげさまでクリス!