Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pack, unpack et manipulations de nombre

2 réponses
Avatar
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

2 réponses

Avatar
Nicolas
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

Avatar
Kevin Denis
Le 19-06-2015, Nicolas a écrit :
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