J'utilise pyDes pour crypter certaines données. Je voulais démontrer que si vous changez même un bit dans la clé ou la valeur initiale, les données cryptées seraient totalement différentes. J'ai mis en place la clé de 16 octets pour changer le dernier caractère de +/- 1, ce qui fait qu'au moins un bit est différent. Cependant, même lorsque je fais cela, les 3 instances différentes de données cryptées ne sont pas toutes différentes.Pourquoi le fait de changer un bit dans une clé Triple DES ou une valeur initiale ne donne pas des données cryptées différentes?
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
Une des affirmations semble échouer si je n'apporte qu'une petite modification à la clé ou à la valeur initiale; J'ai vu à la fois d1 != d2
et d1 != d3
échouer en fonction de ce que je change. J'ai également essayé de changer 'Hello'
à 'Hello' * 50
pour m'assurer que ce n'était pas juste un cas où les données d'entrée étaient trop courtes.
Si je fais des clés totalement aléatoires, les assertions passent. Avec le programme comme vu ci-dessus, d1 != d3
échoue (ces clés sont séparées d'un bit, k1-k2 sont 2 bits différents). Je ne suis en aucun cas un expert en cryptage, mais si deux clés séparées par un seul bit aboutissent aux mêmes données cryptées, cela signifie que l'effort nécessaire à la force brute de la touche vient de diminuer d'un facteur deux, droite?
Est-ce que quelque chose me manque? Triple DES n'est-il pas supposé donner des résultats uniques pour des clés très similaires? Ou est-ce un bug dans PyDes? Peut-être que quelqu'un d'autre pourrait confirmer ce comportement dans une autre implémentation?
@Chris Jester-Young a eu la réponse que certains des bits de la clé sont des bits de parité. Et il se trouve que, selon this article:
Notez que, bien que la touche d'entrée pour le DES est de 64 bits de long, la longueur de clé réelle utilisée par DES est seulement 56 bits. Le bit le moins significatif (le plus à droite) dans chaque octet est un bit de parité, et doit être défini de sorte qu'il y ait toujours un nombre impair de 1 dans chaque octet. Ces bits de parité sont ignorés, de sorte que seuls les sept bits les plus significatifs de chaque octet sont utilisés, ce qui donne une longueur de clé de 56 bits. Cela signifie que la force effective de la clé pour Triple DES est en réalité de 168 bits car chacune des trois clés contient 8 bits de parité qui ne sont pas utilisés pendant le processus de cryptage.
(l'accent était le mien)
Et ces bits de parité étaient exactement les bits je changeais dans l'exemple.
Merci Chris!