Hello,
J'ai regardé ton code, et l'idée est intéressante.
Remarque 1 :
Pour que les lettres accentuées soient traitées correctement, il faut travailler en base 256 (et non 128) dans les fonctions
string2Int et
int2String.
Remarque 2 :
Lorsque le phrase secrète est longue, le premier coefficient du polynôme est beaucoup plus grand que les autres, et il est prépondérant lorsqu'on calcule
pol.eval(x). Il s'ensuit qu'une seule clé permet de retrouver une grande partie de la phrase secrète.
Par exemple, à partir de cette phrase :
Ceci est un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
j'ai généré 10 clés (base 256 dans string2Int), avec un minimum de 5 pour reconstituer la phrase.
Voici le script de décodage d'une seule clé :
$ cat test.py
#! /usr/bin/env python
# -*- coding:utf8 -*-
import sys
from base64 import b64decode
def int2String(nombre):
s = ""
while nombre > 0:
s += chr(nombre % 256)
nombre = nombre / 256
return s
while True :
cle=sys.stdin.readline()
if not cle : break
try :
ind,key=cle[:-1].split('-')
x,y=b64decode(key).split(':')
print("x=%s => %s"%(x,int2String(int(y))))
except ValueError : pass
Voici le fichier contenant les clés générées :
$ cat cles_generees
w5Zcn-MToyMDkzNjkxMDc1MzU3Nzg3MjIyMTcxNDA2NjkwODE2NTY5OTY5ODg0OTU4MDA1Mjc2MTM5NDM5Njg5MDg2NzgwNzc2NzI5NTc1MzExNDE0MzI2MjY0NTk1MTY1NjgyMDUwNTY1NDc0NjU2NDYyMTIxMzEwMjAxNjc5NjY4MjE0ODc1MDY5MjAwNDcxNTQ1OTA1Mjg0NjM5MjYzNzMyMDgyNjMwNTg1MzgyODI1Nzc3MTcxNjYzMjg1MTg1MDc3OTExMDQxNTYwNjU3MjcxMjg2NjYxMzAzNjEyODg0MjUwNzY5ODE2MDYzOTczMjcxODcxMzg2Nzk4NjIxMzA0NjA1MjM2NTk0NDk1Njk5ODQ=
w5Zcn-MzoyMDkzNjkxMDc1MzU3Nzg3MjIyMTcxNDA2NjkwODE2NTY5OTY5ODg0OTU4MDA1Mjc2MTM5NDM5Njg5MDg2NzgwNzc2NzI5NTc1MzExNDE0MzI2MjY0NTk1MTY1NjgyMDUwNTY1NDc0NjU2NDYyMTIxMzEwMjAxNjc5NjY4MjE0ODc1MDY5MjAwNDcxNTQ1OTA1Mjg0NjM5MjYzNzMyMDgyNjMwNTg1MzgyODI1Nzc3MTcxNjYzMjg1MTg1MDc3OTExMDQxNTYwNjU3MjcxMjg2NjYxMzAzNjEyODg0MjUwNzY5ODE2MDYzOTczMjcxODcxMzg2Nzk4NjIxMzA0NjA1MjM2ODAwNDY2OTkxNzA=
w5Zcn-NToyMDkzNjkxMDc1MzU3Nzg3MjIyMTcxNDA2NjkwODE2NTY5OTY5ODg0OTU4MDA1Mjc2MTM5NDM5Njg5MDg2NzgwNzc2NzI5NTc1MzExNDE0MzI2MjY0NTk1MTY1NjgyMDUwNTY1NDc0NjU2NDYyMTIxMzEwMjAxNjc5NjY4MjE0ODc1MDY5MjAwNDcxNTQ1OTA1Mjg0NjM5MjYzNzMyMDgyNjMwNTg1MzgyODI1Nzc3MTcxNjYzMjg1MTg1MDc3OTExMDQxNTYwNjU3MjcxMjg2NjYxMzAzNjEyODg0MjUwNzY5ODE2MDYzOTczMjcxODcxMzg2Nzk4NjIxMzA0NjA1MjM4MTc1NzYxMTA3ODg=
w5Zcn-NzoyMDkzNjkxMDc1MzU3Nzg3MjIyMTcxNDA2NjkwODE2NTY5OTY5ODg0OTU4MDA1Mjc2MTM5NDM5Njg5MDg2NzgwNzc2NzI5NTc1MzExNDE0MzI2MjY0NTk1MTY1NjgyMDUwNTY1NDc0NjU2NDYyMTIxMzEwMjAxNjc5NjY4MjE0ODc1MDY5MjAwNDcxNTQ1OTA1Mjg0NjM5MjYzNzMyMDgyNjMwNTg1MzgyODI1Nzc3MTcxNjYzMjg1MTg1MDc3OTExMDQxNTYwNjU3MjcxMjg2NjYxMzAzNjEyODg0MjUwNzY5ODE2MDYzOTczMjcxODcxMzg2Nzk4NjIxMzA0NjA1MjQyNjUyMjQ1NzEzMzQ=
w5Zcn-OToyMDkzNjkxMDc1MzU3Nzg3MjIyMTcxNDA2NjkwODE2NTY5OTY5ODg0OTU4MDA1Mjc2MTM5NDM5Njg5MDg2NzgwNzc2NzI5NTc1MzExNDE0MzI2MjY0NTk1MTY1NjgyMDUwNTY1NDc0NjU2NDYyMTIxMzEwMjAxNjc5NjY4MjE0ODc1MDY5MjAwNDcxNTQ1OTA1Mjg0NjM5MjYzNzMyMDgyNjMwNTg1MzgyODI1Nzc3MTcxNjYzMjg1MTg1MDc3OTExMDQxNTYwNjU3MjcxMjg2NjYxMzAzNjEyODg0MjUwNzY5ODE2MDYzOTczMjcxODcxMzg2Nzk4NjIxMzA0NjA1MjUzMTI3MTA1OTc0NDg=
w5Zcn-MTE6MjA5MzY5MTA3NTM1Nzc4NzIyMjE3MTQwNjY5MDgxNjU2OTk2OTg4NDk1ODAwNTI3NjEzOTQzOTY4OTA4Njc4MDc3NjcyOTU3NTMxMTQxNDMyNjI2NDU5NTE2NTY4MjA1MDU2NTQ3NDY1NjQ2MjEyMTMxMDIwMTY3OTY2ODIxNDg3NTA2OTIwMDQ3MTU0NTkwNTI4NDYzOTI2MzczMjA4MjYzMDU4NTM4MjgyNTc3NzE3MTY2MzI4NTE4NTA3NzkxMTA0MTU2MDY1NzI3MTI4NjY2MTMwMzYxMjg4NDI1MDc2OTgxNjA2Mzk3MzI3MTg3MTM4Njc5ODYyMTMwNDYwNTI3MzQ2Mjg0NDU1OTE0
w5Zcn-LTI6MjA5MzY5MTA3NTM1Nzc4NzIyMjE3MTQwNjY5MDgxNjU2OTk2OTg4NDk1ODAwNTI3NjEzOTQzOTY4OTA4Njc4MDc3NjcyOTU3NTMxMTQxNDMyNjI2NDU5NTE2NTY4MjA1MDU2NTQ3NDY1NjQ2MjEyMTMxMDIwMTY3OTY2ODIxNDg3NTA2OTIwMDQ3MTU0NTkwNTI4NDYzOTI2MzczMjA4MjYzMDU4NTM4MjgyNTc3NzE3MTY2MzI4NTE4NTA3NzkxMTA0MTU2MDY1NzI3MTI4NjY2MTMwMzYxMjg4NDI1MDc2OTgxNjA2Mzk3MzI3MTg3MTM4Njc5ODYyMTMwNDYwNTIzNjYyNzY0NDU3OTI1
w5Zcn-LTQ6MjA5MzY5MTA3NTM1Nzc4NzIyMjE3MTQwNjY5MDgxNjU2OTk2OTg4NDk1ODAwNTI3NjEzOTQzOTY4OTA4Njc4MDc3NjcyOTU3NTMxMTQxNDMyNjI2NDU5NTE2NTY4MjA1MDU2NTQ3NDY1NjQ2MjEyMTMxMDIwMTY3OTY2ODIxNDg3NTA2OTIwMDQ3MTU0NTkwNTI4NDYzOTI2MzczMjA4MjYzMDU4NTM4MjgyNTc3NzE3MTY2MzI4NTE4NTA3NzkxMTA0MTU2MDY1NzI3MTI4NjY2MTMwMzYxMjg4NDI1MDc2OTgxNjA2Mzk3MzI3MTg3MTM4Njc5ODYyMTMwNDYwNTIzNzIyNzk1NTQxNzE5
w5Zcn-LTY6MjA5MzY5MTA3NTM1Nzc4NzIyMjE3MTQwNjY5MDgxNjU2OTk2OTg4NDk1ODAwNTI3NjEzOTQzOTY4OTA4Njc4MDc3NjcyOTU3NTMxMTQxNDMyNjI2NDU5NTE2NTY4MjA1MDU2NTQ3NDY1NjQ2MjEyMTMxMDIwMTY3OTY2ODIxNDg3NTA2OTIwMDQ3MTU0NTkwNTI4NDYzOTI2MzczMjA4MjYzMDU4NTM4MjgyNTc3NzE3MTY2MzI4NTE4NTA3NzkxMTA0MTU2MDY1NzI3MTI4NjY2MTMwMzYxMjg4NDI1MDc2OTgxNjA2Mzk3MzI3MTg3MTM4Njc5ODYyMTMwNDYwNTIzOTgzNzkyNzU3NTkz
w5Zcn-LTg6MjA5MzY5MTA3NTM1Nzc4NzIyMjE3MTQwNjY5MDgxNjU2OTk2OTg4NDk1ODAwNTI3NjEzOTQzOTY4OTA4Njc4MDc3NjcyOTU3NTMxMTQxNDMyNjI2NDU5NTE2NTY4MjA1MDU2NTQ3NDY1NjQ2MjEyMTMxMDIwMTY3OTY2ODIxNDg3NTA2OTIwMDQ3MTU0NTkwNTI4NDYzOTI2MzczMjA4MjYzMDU4NTM4MjgyNTc3NzE3MTY2MzI4NTE4NTA3NzkxMTA0MTU2MDY1NzI3MTI4NjY2MTMwMzYxMjg4NDI1MDc2OTgxNjA2Mzk3MzI3MTg3MTM4Njc5ODYyMTMwNDYwNTI0Njg2OTYyMjE0Njk5
Et voici le résultat, en lisant les clés une à une :
$ ./test.py <cles_generees
x=1 => est un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=3 => ^N%est un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=5 => ^ZSEest un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=7 => Ɖest un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=9 => H۸pfst un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=11 => g+zhst un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=-2 => ſDH!est un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=-4 => dfB/est un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=-6 => Y
lest un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
x=-8 => +G6fst un long texte qui me sert à tester la solidité de la méthode de décomposition de la phrase secrète
Remède proposé :
Remplacer
genPoly par celui-ci :
def genPoly(nombre, degre):
pol = [nombre]
rnd_max=128**4
while rnd_max<nombre : rnd_max*=2
while degre > 0:
# pol.append(random.randint(0,128**4 - 1))
pol.append(random.randint(0,rnd_max - 1))
degre -= 1
return polynome.Polynome(pol)
pour que les coefficients du polynôme aient le même ordre de grandeur, ou que le premier soit le plus petit.
Édité :
Remarque 3 :
Avec cette chaîne de départ
ABC, en générant 5 clés dont 4 obligatoires, on récupère cette chaîne lors du déchiffrement
@BC. Cela est dû à une erreur d'arrondi lors de la conversion de
pol.eval(0) en entier (ligne 47 de
dechiffre.py, qu'il faut je pense remplacer par
return int2String(int(pol.eval(0)+polynome.Decimal(".5")))