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
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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
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 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
Le 19-06-2015, Nicolas <nicolasp@aaton.com> 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