pack, unpack et manipulations de nombre

Le
Kevin Denis
Bonjour,

Je souhaite réécrire en python une partie de l'authentification SNMP

-prendre une clé K de 16 octets
-l'étendre à 64 octets en ajoutant 48 x00 -> Kl
-prendre IPAD='x36'*64
-prendre OPAD='x5c'*64
-calculer K1=Kl^IPAD
-calculer K2=Kl^OPAD
prendre le message, et faire
MD5(K2+MD5(K1+message)) ==> authentification (les 12 premiers octets)

J'ai la clé sous la forme hexa:
0102030405060801020304050608

-> Je fais:

Kl=K+'00'*48
IPAD='36'*64
OPAD='5c'*64
K1=(int(Kl,16))^(int(IPAD,16))
K2=(int(Kl,16))^(int(OPAD,16))

m=hashlib.md5()

Et là, je devrais faire des m.update(K1) m.update(message)
mais le K1, c'est un nombre sur 64 octets, et je ne vois pas comment
le remettre correctement en forme..

Je pensais utiliser un struct.pack, mais la doc de pack me dis que je
peux au mieux faire un unsigned long long (Q) de 8 octets.

Du coup, comment faire?

Merci
--
Kevin
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas
Le #26357204
Le 18/06/2015 11:11, Kevin Denis a écrit :
Bonjour,

Je souhaite réécrire en python une partie de l'authentification SNMP

-prendre une clé K de 16 octets
-l'étendre à 64 octets en ajoutant 48 x00 -> Kl
-prendre IPAD='x36'*64
-prendre OPAD='x5c'*64
-calculer K1=Kl^IPAD
-calculer K2=Kl^OPAD
prendre le message, et faire
MD5(K2+MD5(K1+message)) ==> authentification (les 12 premiers octets)

J'ai la clé sous la forme hexa:
0102030405060801020304050608

-> Je fais:

Kl=K+'00'*48
IPAD='36'*64
OPAD='5c'*64
K1=(int(Kl,16))^(int(IPAD,16))
K2=(int(Kl,16))^(int(OPAD,16))

m=hashlib.md5()

Et là, je devrais faire des m.update(K1) m.update(message)
mais le K1, c'est un nombre sur 64 octets, et je ne vois pas comment
le remettre correctement en forme..

Je pensais utiliser un struct.pack, mais la doc de pack me dis que je
peux au mieux faire un unsigned long long (Q) de 8 octets.

Du coup, comment faire?


Passer une string ne ferait t-il pas l'affaire ?

s = "%0128X" % K1 # Representation hexa du 64bits
m.update(s)


Sinon (code non testé) :

def get_bytes(k):
l = []
for i in range(64) :
l.append(k%256)
k = k/256
l.reverse()
return l

def get_pack64(k):
s = ""
for e in get_bytes(k) :
s += struct.pack("B", e)
return s

s = get_pack64(K1)
m.update(s)


Merci

Kevin Denis
Le #26357241
Le 19-06-2015, Nicolas
Je pensais utiliser un struct.pack, mais la doc de pack me dis que je
peux au mieux faire un unsigned long long (Q) de 8 octets.

Du coup, comment faire?


Passer une string ne ferait t-il pas l'affaire ?

s = "%0128X" % K1 # Representation hexa du 64bits
m.update(s)



C'est ce que j'ai fini par faire. C'est peut-être plus simple à relire
en plus.
--
Kevin
Publicité
Poster une réponse
Anonyme