Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 03-08-2017 23:34:55
- Manghao
- Invité
Trouver la clé !
Bonjour,
aujourd'hui je poste ici un bon casse tête :)
Le but est de trouver la clé de chiffrement d'une donnée.
Vous aurez en votre possession la donnée chiffrée et la donnée déchiffrée.
Je précise aussi que c'est une colle que l'on m'impose je n'arrive pas a trouver, alors si des gens parmi vous y arrive et trouve un algorithme, ce serait sympa de m'en faire part et de le partager aux autres.
Donnée chiffrée:
Donnée déchiffrée:
Voilà si vous pouvez m'aider, ce serait sympathique, je suis dessus depuis 2-3 semaines déjà.
Cordialement
#2 03-08-2017 23:42:07
- Manghao
- Invité
Re : Trouver la clé !
J'ai oublié de préciser une donnée :
c'est ceci 0905071014X alors je ne sais pas a quoi ça sert, je ne sais pas s'il faut inclure le X ou non si c'est utile pour avoir la clé.
#3 22-08-2017 20:51:34
- Rossignol
- Membre
- Inscription : 19-06-2015
- Messages : 290
Re : Trouver la clé !
Bonjour,
Il s'agit apparemment d'un chiffrement par blocs de 8 bits (1 octet).
Clairement le clair est une suite de caractères et le crypto est une suite de codes en hexadécimal.
Le crypto à une taille double de celle du clair.
b -> 41
h -> 52
a -> 19
a -> 3d
e -> 5c
La méthode de chiffrement la plus simple est de faire un xor entre chaque bloc du clair et un bloc de la clé.
Si $P_i$, $C_i$ et $K_i$ sont les i-ièmes blocs du plaintext (clair), du chiffré et de la clé, on a l'équation de chiffrement : $C_i = P_i\oplus K_i$
Comme $$C_i = P_i\oplus K_i \Longleftrightarrow K_i = P_i\oplus C_i \Longleftrightarrow P_i = C_i\oplus K_i $$
on peut tester cette hypothèse en calculant la suite $K_i$.
Le programme Python suivant affiche la clé sous forme d'une chaine de caractères. (numériquement, tous les $K_i$ sont compris entre 32 et 127 : ils correspondent à des codes ASCII de caractères imprimables)
# il faut mettre les chaines completes ici :
plain = 'bhaaeaaaaabhaaeaaaaabhaae'
crypto = '4152193d5c271a4a0e143d03595e03132d22303225195b5408'
P = [ord(c) for c in plain]
C = [int(crypto[i:i+2], 16) for i in range(0, len(crypto), 2)]
K = [P[i]^C[i] for i in range(len(P))]
print('min = ', min(K))
print('max = ', max(K))
print(''.join([chr(c) for c in K]))
En examinant la sortie du programme, on remarque tout de suite que les 169 premiers caractères se répètent cycliquement : on a trouvé la clé :
key = '#:x\\9F{+ou_k8?frLCQSGq:5mcAPs 3?A-?\\I,cKH:Cs~"st7H.X{KTy5gEA:9j.YAL_tTi?M+Ds\\}UC!a,/@*;K\\SW`KUg +R_*7/ Q$C?v0#o|!a@3k^S!.c)2lQMxs+|M4C@A~OgDo}lrAhXG;H~2[k.Qs.OJqa|j5P;/O'
Comme pour le chiffre de Vigenère, on répète autant de fois la clé que l'on en a besoin pour traiter tout le texte à chiffrer.
On peut vérifier le chiffrement :
def gegene():
"""Retourne un iterateur qui donne un K_i a chaque appel
"""
key = '#:x\\9F{+ou_k8?frLCQSGq:5mcAPs 3?A-?\\I,cKH:Cs~"st7H.X{KTy5gEA:9j.YAL_tTi?M+Ds\\}UC!a,/@*;K\\SW`KUg +R_*7/ Q$C?v0#o|!a@3k^S!.c)2lQMxs+|M4C@A~OgDo}lrAhXG;H~2[k.Qs.OJqa|j5P;/O'
i = 0
while True:
yield ord(key[i])
i = (i+1)%len(key)
plain = 'bhaaeaaaaabhaaeaaaaabhaae' # <-- mettre tout le clair ici
crypto = ''
k = gegene()
for c in plain:
crypto += "{0:02x}".format(ord(c) ^ next(k)) # le xor + format hexa
print(crypto)
et le déchiffrement :
def gegene():
"""Retourne un iterateur qui donne un K_i a chaque appel
"""
key = '#:x\\9F{+ou_k8?frLCQSGq:5mcAPs 3?A-?\\I,cKH:Cs~"st7H.X{KTy5gEA:9j.YAL_tTi?M+Ds\\}UC!a,/@*;K\\SW`KUg +R_*7/ Q$C?v0#o|!a@3k^S!.c)2lQMxs+|M4C@A~OgDo}lrAhXG;H~2[k.Qs.OJqa|j5P;/O'
i = 0
while True:
yield ord(key[i])
i = (i+1)%len(key)
crypto = '4152193d5c271a4a0e143d03595e03132d22303225195b5408' # <- tout le crypto ici
plain = ''
k = gegene()
for i in range(0, len(crypto), 2):
plain += chr(int(crypto[i:i+2], 16) ^ next(k))
print(plain)
@+
Hors ligne
#4 30-08-2017 20:55:39
- Manghao
- Invité
Re : Trouver la clé !
Merci à vous Rossignol,
merci pour vos explications et algorithmes.
Cependant, le problème était de trouver la clé seulement a partir de la donnée chiffrée pour trouver la données déchiffrée, la donnée déchiffrée que j'ai posté ici, m'avait été donnée pour m'aider, sauf qu'a la base, je n'ai pas cette donnée.
Je ne sais pas si je suis clair dans mon explication.
Encore merci à vous.
Cordialement Manghao.
#5 01-09-2017 16:43:01
- Rossignol
- Membre
- Inscription : 19-06-2015
- Messages : 290
Re : Trouver la clé !
Bonjour Manghao,
Votre problème est mal formulé. Vous énoncez :
Le but est de trouver la clé de chiffrement d'une donnée.
Vous aurez en votre possession la donnée chiffrée et la donnée déchiffrée.
Maintenant, les règles du jeu changent : on n'a que le cryptogramme.
Évidemment, c'est plus compliqué.
En utilisant l'indice de coïncidence, on trouve facilement que la clé est périodique de longueur 169.
On peut donc découper le crypto en 28 segments de 169 caractères, tous "in depth".
Mais le souci, c'est que le texte "clair" ne veut rien dire : ce n'est pas du français, ni de l'anglais, ni même du serbo-croate.
Pourquoi le texte "clair" commence-t-il par bhaaeaaaaabhaaeaaaaabhaae et non pas par aaaaabhaaebhaaeaaaaabhaae ? Qu'est-ce qui permet de distinguer les deux ?
Il faudrait au moins avoir des statistiques sur le clair pour tenter une attaque.
On a l'impression que vous ne dites pas tout, que vous ne donnez qu'une partie du problème (vous ne voulez pas vous faire repérer sur internet par le prof ? :-)
@+
Hors ligne
#6 02-09-2017 22:23:27
- Manghao
- Invité
Re : Trouver la clé !
Bonjour Rossignol,
ce n'est pas du tout un exercice pour un quelconque cours, c'est juste des défis entre amis.
Et oui j'ai mal formulé ma demande, j'en suis désolé.
Pages : 1