Python: шифрование DES-ECB с двумя разными ключами приводит к одному и тому же зашифрованному тексту

Я пытаюсь зашифровать открытый текст 6d65737361676531 (в шестнадцатеричном формате) с помощью ключей 0000000000000000 и 0000000000000001 (оба в шестнадцатеричном формате), используя шифр DES в режиме ECB от Crypto.Cipher. Но почему-то и ciphertext1_hex, и ciphertext2_hex равны 3bd2ac43547a7961, т.е. дают один и тот же зашифрованный текст. Кто-нибудь знает, почему это так?

from Crypto.Cipher import DES

key1_hex = "0000000000000000"
key2_hex = "0000000000000001"

key1 = key1_hex.decode("hex")
key2 = key2_hex.decode("hex")

des1 = DES.new(key1, DES.MODE_ECB)
des2 = DES.new(key2, DES.MODE_ECB)

plaintext_hex = "6d65737361676531"
plaintext = plaintext_hex.decode("hex")

ciphertext1 = des1.encrypt(plaintext)
ciphertext2 = des2.encrypt(plaintext)

ciphertext1_hex = ciphertext1.encode("hex")
ciphertext2_hex = ciphertext2.encode("hex")

person Anders    schedule 27.05.2016    source источник
comment
Конечно, не следует использовать ни DES, ни режим ECB, если целью является безопасность.   -  person zaph    schedule 27.05.2016
comment
Обратите внимание, что шестнадцатеричные 0000000000000000 и 0000000000000001 являются слабыми ключами DES, как и многие другие, и их не следует использовать.   -  person zaph    schedule 27.05.2016


Ответы (1)


В ключе DES только первые 7 бит каждого байта являются фактическим материалом ключа (что дает ключ DES из 56 бит). Последний бит каждого байта является битом четности. Таким образом, два ключа на самом деле являются одним и тем же ключом. Некоторые реализации будут жаловаться, если бит четности неверен. Но этот, видимо, нет.

person Ebbe M. Pedersen    schedule 27.05.2016