Pycrypto: l'Incrémentation de la CTR Mode
Ne peut toujours pas obtenir que cela fonctionne. Ma question est comment faire le décryptage de la ligne de travail. Voici ce que j'ai écrit:
class IVCounter(object):
@staticmethod
def incrIV(self):
temp = hex(int(self, 16)+1)[2:34]
return array.array('B', temp.decode("hex")).tostring()
def decryptCTR(key, ciphertext):
iv = ciphertext[:32] #extracts the first 32 characters of the ciphertext
#convert the key into a 16 byte string
key = array.array('B', key.decode("hex")).tostring()
print AES.new(key, AES.MODE_CTR, counter=IVCounter.incrIV(iv)).decrypt(ciphertext)
return
Mon message d'erreur est:
ValueError: "compteur" paramètre doit être un objet appelable
Je ne peux pas comprendre comment le pycrypto veut de moi pour organiser cette troisième argument à nouveau.
Peut aider quelqu'un? Merci!
MODIFIER
Nouveau code après la mise en œuvre des suggestions ci-dessous. Toujours bloqué!
class IVCounter(object):
def __init__(self, start=1L):
print start #outputs the number 1 (not my IV as hoped)
self.value = long(start)
def __call__(self):
print self.value #outputs 1 - need this to be my iv in long int form
print self.value + 1L #outputs 2
self.value += 1L
return somehow_convert_this_to_a_bitstring(self.value) #to be written
def decryptCTR(key, ciphertext):
iv = ciphertext[:32] #extracts the first 32 characters of the ciphertext
iv = int(iv, 16)
#convert the key into a 16 byte string
key = array.array('B', key.decode("hex")).tostring()
ctr = IVCounter()
Crypto.Util.Counter.new(128, initial_value = iv)
print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)
return
MODIFIER ne peut TOUJOURS pas obtenir que cela fonctionne. très frustré et complètement à court d'idées. Voici le dernier code: (veuillez noter que mes chaînes d'entrée de 32 bits hex de chaînes de caractères qui doit être interprété de deux paires de chiffres pour convertir des entiers longs.)
class IVCounter(object):
def __init__(self, start=1L):
self.value = long(start)
def __call__(self):
self.value += 1L
return hex(self.value)[2:34]
def decryptCTR(key, ciphertext):
iv = ciphertext[:32] #extracts the first 32 characters of the ciphertext
iv = array.array('B', iv.decode("hex")).tostring()
ciphertext = ciphertext[32:]
#convert the key into a 16 byte string
key = array.array('B', key.decode("hex")).tostring()
#ctr = IVCounter(long(iv))
ctr = Crypto.Util.Counter.new(16, iv)
print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)
return
TypeError: CTR fonction de compteur de chaîne retournée pas de longueur de 16
OriginalL'auteur Alex | 2012-07-25
Vous devez vous connecter pour publier un commentaire.
En Python, il est tout à fait valide pour traiter les fonctions comme des objets. Il est aussi parfaitement valide pour traiter n'importe quel objet qui définit
__call__(self, ...)
comme une fonction.Donc ce que vous voulez pourrait quelque chose comme ceci:
Cependant, PyCrypto contre la méthode pour vous, qui devraient être beaucoup plus rapide que de pur Python:
ctr
est maintenant avec un état de la fonction (et, simultanément, un objet appelable) qui s'incrémente et renvoie son état interne chaque fois que vous appelez. Vous pouvez ensuite fairetout comme avant.
Voici un exemple de travail à l'aide de la Cryptographie.Algorithme de chiffrement.AES dans la CTR mode spécifié par l'utilisateur vecteur d'initialisation:
ctr = Crypto.Util.Counter.new(NUM_COUNTER_BITS, initial_value = 90000001L)
, où initial_value est votre IV en entier long formulaire. La raison pour laquelle nous considérons " ctr " pour être un dynamique la fonction est parce qu'il stocke son propre compteur interne. Chaque foisctr()
est appelée, ses internes compteur s'incrémente de un. Donc, par l'initialisation cette fonction avec le IV dont vous avez besoin, vous êtes alors incrémenter "votre" IV.Dans le cas où vous êtes en train de regarder mon exemple et pas tout à fait le comprendre, l'objet appelable (penser que c'est un C++ foncteur) peut prendre un argument "démarrer" lorsqu'il est initialisé; puis, de son propre compteur interne est défini pour tout ce que vous voulez. Chaque fois que vous appelez que instance de
IVCounter
, son propre compteur interne (qui vous initialisé) est incrémenté. Vous pouvez en principe plusieurs instances deIVCounter
définis, tous mutuellement indépendants.Une chose est sûre @usr55410. Deux problèmes avec votre code: vous n'avez pas utiliser la variable
iv
après avoir initialisé; si vous êtes à l'aide de mon IVCounter, vous voulez directr = IVCounter(long(iv))
, ou similaire, pour mettre le compteur de l'état initial. Si vous êtes en utilisant de la Cryptographie.Util.Compteur (de préférence pour la vitesse), vous voulez directr = Crypto.Util.Counter.new(256, long(iv))
. Le deuxième problème (qui le précède résout également), c'est que la Crypto.Util.Le compteur.de nouvelles retourne une fonction qui vous ne donnez pas n'importe où.De plus, être prudent d'autre chose: PyCrypto de chiffrement de routines d'attendre (et de retour) bytestrings, dont la plupart sont certainement pas à distance lisible alors que sous forme cryptée. Vous aurez besoin de comprendre comment convertir des chaînes et de leur représentation hexadécimale; ce n'est pas un problème difficile, résoudre, par exemple sur stackoverflow.com/questions/2340319. Et une dernière chose: étant donné que vous souhaitez généralement IVs à être long (beaucoup plus que les int peuvent généralement fournir), vous aurez envie de déclarer iv avec
long()
au lieu deint()
.1: la clé de Ma chaîne est binaire données; mon IV chaîne est un hexstring (par exemple
baadf00d
). 2: Vous devez réinitialiser le compteur avant de déchiffrer, c'est à dire créer un nouveau compteur avec le même IV, puis créer un nouveau contexte de chiffrement en utilisant le nouveau compteur, et l'utiliser pour déchiffrer.OriginalL'auteur atomicinf