Académique Documents
Professionnel Documents
Culture Documents
a=2 q+1
c=b+1
2 2 2
On a: a =( 2 q+1 ) =4 q + 4 q+1
c 2=b 2+ 2b +1
2 2 2
c =q ( a+1 ) + 2q ( a+1 ) +1
Posons x=2 q ( a+1 ) +1
a 2=4 q2 +4 q+1
a 2=2 q ( 2 q+2 ) +1
a 2=2 q ( 2 q+1+1 ) +1
a 2=2 q ( a+1 ) +1
a 2=x
Ainsi a2 +b2=c 2
def codePythagoricien() :
listeTriples = []
# les lettres de l'alphabet en ASCII en minuscule vont de 97 à 122
# on utilise le code ASCII de la lettre pour générer le triplé correspondant
for q in range(97, 123):
listeTriples.append([2*q + 1, q*(2*q + 2), q*(2*q + 2) + 1])
return listeTriples
u2 + v 2=a2 x2 +b 2 y 2 +a 2 y 2 +b2 x 2
u2 + v 2=( a2 +b 2 ) x 2 +( b ¿ ¿ 2+a2 ) y 2 ¿
u2 + v 2=( a2 +b 2 ) (x ¿ ¿2+ y2 ) ¿
u2 + v 2=c 2 z 2
u2 + v 2=z 2
Par conséquent ⊕ est une loi interne .
c=U 3 V 3 W 3
On a donc ( U ⊕V ) ⊕W =( a , b , c)
Posons x=(V 1 W 1 +V 2 W 2 )U 1 +¿(V 1 W 2 −V 2 W 1 )∨U 2
y=¿
z=U 3 V 3 W 3
On a alors U ⊕ ( V ⊕ W )=( x , y , z )
Montrons que (a, b, c) = (x, y, z)
On a a 2+b 2=c 2=z 2=x 2 + y 2
D’où a 2=x 2 + y 2−b 2
On a aussi :
y 2=U 12 ( V 21 W 22−2 V 1 V 2 W 1 W 2 +V 22 W 21 ) +U 22 ( V 21 W 21+ 2V 1 V 2 W 1 W 2 +V 22 W 22 ) +2 U 1 U 2 W 1 W 2 ( V 21−V 22 ) + 2U 1 U 2 V 1 V 2 (W 22−W 21)
En factorisant W 22 et W 21 on obtient :
2
y 2=(W 2 ( U 1 V 1 +U 2 V 2 ) )2+(W 1|( U 1 V 2−U 2 V 1)|) −−2W 1 W 2 ¿(U 22−U 21 ¿ ¿
Par factorisation :
2
y 2=(W 2 ( U 1 V 1 +U 2 V 2 ) )2+(W 1|( U 1 V 2−U 2 V 1)|) −2W 1 W 2 ¿
2
y 2=(W 2 ( U 1 V 1 +U 2 V 2 ) )2+(W 1|( U 1 V 2−U 2 V 1)|) −2W 1 W 2 ( U 1 V 2+U 2 V 1 )|U 1 V 1−U 2 V 2|=b 2
y 2=b 2
Donc : x 2=a 2
Alors (a, b, c) = (x, y, z)
En conclusion :
( U ⊕V ) ⊕W =U ⊕ ( V ⊕ W )=U ⊕ V ⊕ W
v = |(ay – bx)|
w = cz
B⊕ A=C ' avec C’= (u’, v’, w’) tel que : u’ = ax +by = u
{ ⇔
{ {
0=|(ay −bx)| |(ay−bx )|=0 ( ay−bx )=0(2)
1=cz z=1 /c z=1/c
( 1 )∗y −( 2 )∗x=b ( x2 + y 2 ) = y
b
y=
c2
a b 1
D’où pour tout triplé pythagoricien A (a, b, c) il existe A’= ( 2 , 2 , c ¿ tel que
c c
A⊕A’=I
4) Déduisons-en que G est un groupe :
De tout ce qui précède, l’ensemble G muni de la loi ⊕ (G,⊕ ¿ est associatif,
commutatif, admet un élément neutre et en plus tout élément de G admet
également un inverse l’on en déduit donc que c’est un groupe.
Implémentation de l’opération en langage python
def loiTriplePythagore (A, B):
a = A[0]
Mini projet : sécurité informatique|7
b = A[1]
c = A[2]
x = B[0]
y = B[1]
z = B[2]
u = a*x + b*y
v = abs(a*y - b*x)
w = c*z
return [u, v, w]
5) Calcul de puissance :
k
A =A ⊕ A ⊕ ….. ⊕ A
{ {
Pour k=2, on a : A = A ⊕ A= v=|(ab−ba)|= v=0 =c (1 , 0 , 1)
w=c 2 w=c2
donc A 2=c 2 I
A2 (p +1)=c2 (p +1) I
¿ c 2 I ⊕c 2 p A=c 2 p +2 A
def pythTripletMod(p):
'''
Génère une liste de triplés pythagoriciens modulo p.
'''
C = []
compteur = 0
for a in range(1, int((p-1)/2 + 1)):
aa = a ** 2 % p
for b in range(1, int((p-1)/2 + 1)):
bb = b ** 2 % p
for c in range(1, int((p-1)/2 + 1)):
cc = c ** 2 % p
if (aa + bb) % p == cc and a<=b:
compteur = compteur + 1
C.append([a, b, c])
return C
def generatePythTripletMod():
'''
Génère un triplé pythagoricien aléatoire modulo un nombre premier aléatoi
re.
'''
p = generatePrime()
return (random.choice(pythTripletMod(p)), p
def pythTripletMod(p):
'''
Génère une liste de triplés pythagoriciens modulo p.
'''
C = []
compteur = 0
for a in range(1, int((p-1)/2 + 1)):
aa = a ** 2 % p
for b in range(1, int((p-1)/2 + 1)):
bb = b ** 2 % p
for c in range(1, int((p-1)/2 + 1)):
cc = c ** 2 % p
if (aa + bb) % p == cc and a<=b:
compteur = compteur + 1
C.append([a, b, c])
return C
def generatePythTripletMod():
'''
Génère un triplé pythagoricien aléatoire modulo un nombre premier aléatoi
re.
'''
p = generatePrime()
return (random.choice(pythTripletMod(p)), p)
from tkinter import *
p = 0
l1=0
l1server=0
Q =[]
Q1 = []
puissanceServer = []
puissanceClient = []
tripletMessage = []
messageDecrypt = ''
def genPrem():
global l1
global p
global Q1
l1= random.randrange(2,p//2)
msg3=('Le nombre généré '+str(l1))
label2.configure(text=msg3)
Q1 = [l1*x for x in Q[0]]
msg4=('Effet sur le triplet '+str(Q1))
label3.configure(text=msg4)
def coder():
global p
global Q
Q= generatePythTripletMod()
p = Q[1]
#showinfo('Entrer votre programme de crypto')
msg=('Triplet '+str(Q[0])+' modulo '+str(p))
msg2=('p = '+ str(p))
label.configure(text=msg)
label1.configure(text=msg2)
app.update()
def puisaance():
global Q1
global l1
global l1server
global p
puissanceServer = pythTripletModPower(Q1,l1,p)
puissanceClient = pythTripletModPower(Q1,l1server,p)
msg4= ('Clé Serveur '+str(puissanceServer))
msg5= ('Clé Client '+str(puissanceClient))
labelPuissanceServeur.configure(text=msg4)
labelPuissanceClient.configure(text=msg5)
def crypt():
global saisieCrypt
global tripletMessage
valeurSaisie = saisieCrypt.get()
tripletMessage = generatePythCode(str(valeurSaisie))
msg6 = ('Le cryptage du méssage est fait')
labelVerify.configure(text= msg6)
#print("Le mot est : "+valeurSaisie)
def decrypt():
global tripletMessage
global messageDecrypt
messageDecrypt = decodePythCode(tripletMessage)
b1 = Button(app,text='Générer triplets',command=coder,bg='#5dc04d',fg='whit
e',font=16)
b1.grid(row=2,columns=1)
bCle = Button(app,text='Générer les clé',command = puisaance,bg='#5dc04d',f
g='white',font=16)
bCle.grid(row=9,columns=10)
saisieCrypt = Entry(app, width=50, show='*',font=16)
saisieCrypt.grid(row=14,columns=1)
saisieCrypt.focus_force()
app.grid_columnconfigure(4,minsize=1000)
app.mainloop()
for num in range(2, n):
if n % num == 0:
isPrime = False
if isPrime:
primeList.append(n)
return primeList
def generatePrime():
'''
Génère un nombre premier aléatoire compris entre 7 et 200.
'''
return random.choice(primesInRange(7, 200))
def primesInRange(x, y):
'''
Retourne tous les nombres premiers compris entre x et y.
x et y sont des entiers.
'''
primeList = []
for n in range(x, y):
isPrime = True
for num in range(2, n):
if n % num == 0:
if isPrime:
primeList.append(n)
return primeList
def generatePrime():
'''
Génère un nombre premier aléatoire compris entre 7 et 200.
'''
return random.choice(primesInRange(7, 200))
def generatePythCode(message):
'''
Génère un message codé sur la base des triplés pythagoriciens.
Chaque lettre du message est codé en un triplet à l'aide de son code ASCII.
La fonction retourne une liste de triplets pythagoriciens.
'''
return [singlePythTriplet(ord(char)) for char in message]
def decodePythCode(triplet):
'''
Décode un message initialement codé sur la base des triplés pythagoriciens.
Réalise l'opération inverse de la fonction generatePythCode().
La fonction retourne un string correspondant au message initialement codé.
'''
message = ""
for t in triplet:
for q in range(32, 250):
if singlePythTriplet(q) == t:
message = message + chr(q)
return message
Mini projet : sécurité informatique|17