Comment AES dans la CTR de travaux pour Python avec PyCrypto?
Je suis à l'aide de python 2.7.1
Je veux crypter qqch à l'aide de l'AES dans le CTR de la mode. J'ai installé PyCrypto bibliothèque pour python. J'ai écrit le code suivant:
secret = os.urandom(16)
crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter=lambda: secret)
encrypted = crypto.encrypt("asdk")
print crypto.decrypt(encrypted)
je dois courir crypto.décrypter autant de fois que la taille en octets de mon texte brut afin d'obtenir correctement les données déchiffrées. I. e:
encrypted = crypto.encrypt("test")
print crypto.decrypt(encrypted)
print crypto.decrypt(encrypted)
print crypto.decrypt(encrypted)
print crypto.decrypt(encrypted)
Le dernier appel à déchiffrer va me donner le texte en clair en arrière. Les autres sorties de décrypter certains charabia des chaînes de caractères .
Je me demande si c'est normal ou pas? Dois-je inclure dans une boucle avec la taille de mon texte en clair à chaque fois ou j'ai eu qqch de mal?
OriginalL'auteur curious | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
Selon @gertvdijk, AES_CTR est un chiffrement de flux qui ne pas besoin de rembourrage. J'ai donc supprimé les codes.
Voici quelque chose que je sais.
Vous devez utiliser une même clé(le premier paramètre dans
AES.new(...)
) dans le chiffrement et le déchiffrement, et de garder la clé privée.Le chiffrement/déchiffrement des méthodes sont stateful, cela signifie que
crypto.en(de)crypt("abcd")==crypto.en(de)crypt("abcd")
est pas toujours vrai. Dans votre CTR, votre compteur de rappel renvoie toujours la même chose, de sorte qu'il devient apatride quand chiffrer (je ne suis pas 100% sûr que c'est la raison), mais nous trouvons qu'il est un peu dynamique dans le déchiffrement. En conclusion, il faut toujours utiliser un nouvel objet pour le faire.La
counter callback
fonction de chiffrement et de déchiffrement doit se comporter de la même. Dans votre cas, c'est de faire les deux d'entre eux de retourner le même secret. Pourtant, je ne pense pas que lesecret
est un "secret". Vous pouvez utiliser un aléatoire généré"secret"
et le passer à travers la communication des pairs sans cryptage de sorte que l'autre partie peut l'utiliser directement, tant que lesecret
est pas prévisible.Donc je voudrais écrire ma chiffrement comme ça, j'espère qu'elle va offrir de l'aide.
Quelques test:
Référence: http://packages.python.org/pycrypto/Crypto.Cipher.blockalgo-module.html#MODE_CTR
nous avons besoin de connaître la longueur ajoutée quand dois-unpad, et on le stocke en utilisant un char(il ne sera pas plus grand que 16 ans, donc un octet est assez, et que nous utilisons le code ascii).
(BS - len(s) % BS)
est la longueur ajoutée, etchr(...)
renvoie un octet(chaîne de caractères en python, en fait), puis on ajoute un X de longueur de chaîne où tous les char sont des chr(X).mais est-ce un coffre-fort rembourrage technique?
pourquoi pas? À mon humble avis, c'est bien.
jusqu'à présent, je pense que le point clé de l'attaque est le pad-oracle, plutôt que les fonctions de remplissage, de sorte que deux solutions possibles peuvent être 1. pour faire de notre pad oracle ne jamais dire non à toute entrée ou 2. ajouter l'authentification de l'info dans les données chiffrées, je.e
enc=secret+md5sum(secret+private_key)+enc_raw
, de manière à toujours dire non valide d'intrants.OriginalL'auteur Marcus
Je vais élaborer sur @gertvdijk l'explication de pourquoi le chiffrement s'est comporté comme il l'a fait dans la question d'origine (mon montage a été rejetée), mais également de souligner que la mise en place du compteur de retourner une valeur statique est un défaut majeur et de montrer comment le configurer correctement.
Remettre le compteur à zéro pour les nouvelles opérations
La raison pour laquelle il se comporte comme décrit dans la question c'est parce que votre texte (4 octets (32 bits) est quatre fois plus petite que la taille de la clé de flux de blocs que le CTR de chiffrement de sorties pour le chiffrement (16 octets (128 bits).
Parce que vous utilisez la même valeur fixe de plus de et plus au lieu d'un compteur réelles, le chiffre qui continue de cracher la même 16 octets blocs de flux. Vous pouvez observer cela en cryptant les 16 octets nuls à plusieurs reprises:
Vous aussi, ne pas réinitialiser le chiffrement de l'état avant d'effectuer le déchiffrement, de sorte que les 4 octets de texte chiffré sont déchiffrés contre les 4 octets de la clé XOR à partir du premier flux de sortie du bloc. Cela peut aussi être observé par le cryptage et le décryptage des octets nuls:
Si c'était de travailler comme vous le voulez, le résultat de ces deux opérations devraient être les mêmes. Au lieu de cela, vous pouvez voir les quatre premiers octets de l'16 octets du bloc dans le premier résultat, et le second quatre octets dans le deuxième résultat.
Après que vous avez utilisé les 16 octets du bloc de XOR clé en effectuant des quatre opérations sur les quatre valeurs d'octets (16 octets au total), un nouveau bloc de XOR clé est générée. Les quatre premiers octets (ainsi que tous les autres) de chaque XOR clé de bloc sont les mêmes, de sorte que lorsque vous appelez déchiffrer ce temps, il vous restitue le texte en clair.
C'est vraiment mauvais! Vous ne devez pas utiliser AES-CTR de cette façon - c'est l'équivalent de simple cryptage XOR avec un 16 octets de répéter clé, qui peut être rompu assez facilement.
Solution
Vous devez réinitialiser l'état de la clef de chiffrement avant d'effectuer une opération sur un nouveau flux de données (ou d'une autre opération), l'instance d'origine de ne plus être dans le bon état initial. Votre problème sera résolu par l'instanciation d'un nouveau
crypto
objet pour le déchiffrement, ainsi que la réinitialisation du compteur et flux en position.Vous devez également utiliser un compteur de fonction qui combine un nonce avec une valeur de compteur qui augmente à chaque fois qu'un nouveau bloc de flux est généré. PyCrypto a un Compteur de classe qui peuvent le faire pour vous.
OriginalL'auteur jamchamb
Commencer avec une nouvelle crypto objet de nouvelles opérations
La raison pour laquelle il se comporte comme décrit dans la question c'est parce que votre texte (4 octets (32 bits) est quatre fois plus petite que la taille du moteur cryptographique de travaux sur de votre choix de mode AES (128 bits) et aussi la réutilisation de la même instance de la crypto objet. Suffit de ne pas réutiliser le même objet, si vous effectuez une opération sur un nouveau flux de données (ou d'une autre opération). Votre problème sera résolu par l'instanciation d'un nouveau
crypto
objet pour le déchiffrement, comme ceci:Pourquoi il n'est pas à propos de rembourrage avec AES-CTR
Cette réponse qui a commencé comme une réponse sur la réponse par Marcus, dans laquelle il a d'abord indiqué que l'utilisation de rembourrage en résoudrait. Bien que je comprenne qu'il regarde comme des symptômes d'un problème de remplissage, il ne l'est certainement pas.
Le point de l'ensemble de l'AES-CTR est que vous n'avez pas besoin de rembourrage, c'est un de chiffrement de flux (à la différence de la BCE/CBC et ainsi de suite)! Chiffrements de flux de travail sur un flux de données, segmentation des données dans des blocs et de la chaîne dans le calcul cryptographique.
OriginalL'auteur gertvdijk
En plus de ce que Marcus a dit, l'
Crypto.Util.Compteur
classe peut être utilisée pour construire votre compteur de bloc de fonction.OriginalL'auteur SquareRootOfTwentyThree