Vous êtes sur la page 1sur 17

République de Côte d’Ivoire

Union – Discipline – Travail


Ministère de l’Enseignement Supérieur et de la Recherche Scientifique

MINI PROJET : SECURITE INFORMATIQUE


PROBLEME 1 : CRYPTAGE PYTHAGORICIEN

Enseignant : Présenté par :


Dr. KIMOU  ABOI Koman Guy-Parfait
 ALLIDJINOU Michée Josué
Mawunyo
 BARRY Mamadou Aliou
 DALLY Djah Elvis
 GAUVIN Ariel
 HOUSSOU Adjoua Déborah
Classe : ING STIC 1A
SOMMAIRE
Partie 1 : Codage de l’alphabet..............................................................................3
1)Démontrons que (a, q(a+1), c) est un triplé pythagoricien primitif et
ordonné :.............................................................................................................3
2) Procédure pour coder les symboles du code ASCII-256...............................4
Partie 2 : Propriétés algébriques des triplés pythagoricien....................................5
1) Montrons que la loi ⊕ est interne :...............................................................5
2) Montrons que la loi ⊕ est associative et commutative :..............................5
3) Démontrons que tout triplé pythagoricien admet un inverse :.....................7
4) Déduisons-en que G est un groupe :............................................................8
5) Calcul de puissance :....................................................................................8
Partie 3 : Propriétés algébriques des triplés pythagoricien..................................10
Partie 4 : Conception et réalisation d’un crypto système à base de triplets
pythagoriciens.....................................................................................................11
Conception de l’interface :...............................................................................11

Mini projet : sécurité informatique|2


Partie 1 : Codage de l’alphabet
1)Démontrons que (a, q(a+1), c) est un triplé pythagoricien primitif et
ordonné :
 Montrons tout d’abord que le triplé est pythagoricien
Soit q ∈ Z¿ , et ≤triplet ( a ,q ( a+1 ) , c ) tel que :

a=2 q+1
c=b+1
2 2 2
On a: a =( 2 q+1 ) =4 q + 4 q+1

( q ( a+1 ) )2=q 2 a2+ 2q 2 a+q 2


2 2 2 2 2
a +b =a + q ( 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

 Montrons que le triplé est primitif :


On a PGCD (a, b) = PGCD (a, q(a+1)) = PGCD (a, qa+ q) =1
É galement : PGCD (q(a+1), q(a+1) +1) =1 car ils sont consécutifs
Ensuite PGCD (a, q(a+1) +1) = PGCD (a, a*q +(q+1)) =1
Par conséquent le triplé (a, b, c) avec a= 2q+1, b=q(a+1) et c=q(a+1) +1 est
primitif.
 Codons les lettres de l’alphabet :
On va associer à chaque lettre un triplé de la forme (a, q(a+1), q(a+1) +1)
avec q qui est égal à la correspondance du nombre dans la table ASCII :

Mini projet : sécurité informatique|3


Coefficient a B c
Lettres
A 195 19012 19013
B 197 19404 19405
C 199 19800 19801
D 201 20200 20201
E 203 20604 20605
F 205 21012 21013
G 207 21424 21425
H 209 21840 21841
I 211 22260 22261
J 213 22684 22685
K 215 23112 23113
L 217 23544 23545
M 219 23980 23981
O 221 24420 24421
P 223 24864 24865
Q 225 25312 25313
R 227 25764 25765
S 229 26220 26221
T 231 26680 26681
U 233 27144 27145
V 235 27612 27613
W 237 28084 28085
X 239 28560 28561
Y 241 29040 29041
Z 243 29524 29525

2) Procédure pour coder les symboles du code ASCII-256

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

Mini projet : sécurité informatique|4


Partie 2 : Propriétés algébriques des triplés
pythagoricien
1) Montrons que la loi ⊕ est interne :
Soit A= (a, b, c) et B= (x, y, z) deux triplés pythagoriciens :
u=ax+ by
Soit C= (u, v, w) tel que : C= A ⊕B= v=|(ay−bx)|
w=cz {
2
u2 + v 2=( ax +by )2+|( ay−bx )|

u2 + v 2=a2 x2 +2 abxy +b 2 y 2 +a2 y 2−2 abxy +b2 x 2

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 .

Déterminons l’élément neutre :


Soit A= (a, b, c) un triplé pythagoricien. Posons I= (1, 0, 1) on a: A⊕I=
a a
{ {
|−b|= b = A
c c

Par conséquent l= (1, 0, 1) est l’élément neutre de l’ensemble des triplés


pythagoriciens.
2) Montrons que la loi ⊕ est associative et commutative :
 Associativité
Soit U =(U 1 , U 2 ,U 3 ) ; V =(V 1 ,V 2 , V 3);W =(W 1 , W 2 ,W 3) des triplés pythagoriciens.
(U⊕ V ¿ ⊕W =((U 1 V 1 +U 2 V 2 );∨(U 1 V 2 −U 2 V 1 )∨; U 3 V 3)⊕ W
( U ⊕V ) ⊕=( ( U 1 V 1 +U 2 V 2 ) W 1 +|( U 1 V 2−U 2 V 1 )|W 2 ;|( U 1 V 1 +U 2 V 2 ) W 2−|U 1 V 2−U 2 V 1|W 1 ¿|; U 3 V 3 W 3 )

U ⊕ ( V ⊕W )=U ⊕((V 1 W 1+V 2 W 2 );∨(V 1 W 2 −V 2 W 1 )∨; V 3 W 3 )

Mini projet : sécurité informatique|5


U ⊕ ( V ⊕W )=¿

Posons a=( U 1 V 1+ U 2 V 2 ) W 1 +|( U 1 V 2−U 2 V 1 )|W 2


b=|( U 1 V 1 +U 2 V 2) W 2 −|U 1 V 2−U 2 V 1|W 1 ¿|

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

Par conséquent la loi ⊕ est associative.


 Commutativité
Soit A = (a, b, c) et B = (x, y, z) deux triplés pythagoriciens :
Mini projet : sécurité informatique|6
On a :
A ⊕ B=C avecC = (u, v, w) tel que : u = ax + by

v = |(ay – bx)|
w = cz
B⊕ A=C ' avec C’= (u’, v’, w’) tel que : u’ = ax +by = u

v’= |(bx – ay)| = |(ay -bx)| = v


w’= cz = w
D’où C = C’
A⊕B = B⊕A (commutativité)
3) Démontrons que tout triplé pythagoricien admet un inverse :
Soit A= (a, b, c) et B= (x, y, z) tel que A⊕ B=¿I on a :
1=ax +by ax +by=1 ax +by =1(1)

{ ⇔
{ {
0=|(ay −bx)| |(ay−bx )|=0 ( ay−bx )=0(2)
1=cz z=1 /c z=1/c

En se servant des équations (1) & (2) on a :


( 1 )∗x + ( 2 )∗y=a ( x 2 + y 2 )=x
a
x=
c2

( 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

u=a2 +b2 u=c 2 2


2

{ {
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

Pour k=3, on a : A3 =A ⊕ A ⊕ A= A2 ⊕ A=c 2 I ⊕ A=c 2 A


Montrons que pour k pair, Ak =C k I :
K étant pair on peut écrire k=2p ;
Pour p=1 on a : A2=c 2 I
Supposons que A2 p=c 2 p I et montrons que A2 (p +1)=c2 (p +1) I
A2 ⊕ A 2 p= A2 ⊕ c 2 p I =c 2 I ⊕ c 2 p I

A2 (p +1)=c2 (p +1) I

Par conséquent pour tout nombre pair k on a Ak =c k I


Montrons que pour k impair : Ak =c k−1 A
K étant impair on peut écrire k=2p+1
Ainsi Ak =A 2 p+1
Démontrons par récurrence que pour k impair, A2 p +1=c 2 p A
Pour p=1, A3 =c 2 A

Mini projet : sécurité informatique|8


Supposons que A2 p +1=c 2 p A et montrons que A 2 p+3 =c 2 p+2 I
A2 p +3= A2 ⊕ A 2 p+1

¿ c 2 I ⊕c 2 p A=c 2 p +2 A

D’où pour tout entier naturel p on a A2 p +1=c 2 p A


import random
from generatePrime import generatePrime

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

Partie 3 : Propriétés algébriques des triplés


pythagoricien
 Code pour générer un triplet pythagoricien modulo p

Mini projet : sécurité informatique|9


import random
from generatePrime import generatePrime

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)

Partie 4 : Conception et réalisation d’un crypto


système à base de triplets pythagoriciens.
Conception de l’interface :

from tkinter import *

Mini projet : sécurité informatique|10


from tkinter.messagebox import *
from generatePythTripletMod import generatePythTripletMod
import random
from pythTripletMultiply import pythTripletModPower
from codeMessage 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()

Mini projet : sécurité informatique|11


def genPremServeur():
    global l1server
    global p
    global Q1
    
    l1server= random.randrange(2,p//2)
    msg3=('lserver1 généré = '+str(l1server))
    labelServer2.configure(text=msg3)
    #Q1  = [l1*x for x in  Q[0]]
    #msg4=(str(Q1))
    #label3.configure(text=msg4)

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)

Mini projet : sécurité informatique|12


    msg7= ('Le message envoyé est : '+str(messageDecrypt))
    labelVerify2.configure(text= msg7)
"""
"""
app=Tk()
app.title("Secure")
app['bg']='#5d7a70'
#app.configure(bg  = '#d3codb')
app.geometry('1000x500')
#f  = font.Font(size  =16)

label = Label(app,  text  = "Pour  resoudre le  problème  de sécurité informatique


",bg='#5d7a70',font=16)
label.grid(row=0,columns=1)

label1 = Label(app,  text  = 'p=  '+str(p),bg='#5d7a70',font=16)


label1.grid(row=4,columns=1)

label2 = Label(app,  text  = 'L1= '+str(l1),bg='#5d7a70',font=16)


label2.grid(row=5,columns=1)

label3 = Label(app,  text  = 'C  est  Q1 '+str(Q1),bg='#5d7a70',font=16)


label3.grid(row=6,columns=1)

b1 = Button(app,text='Générer  triplets',command=coder,bg='#5dc04d',fg='whit
e',font=16)
b1.grid(row=2,columns=1)

b2 = Button(app,text='Générer  un nombre aléatoire  Client',command=genPre


m,bg='#5dc04d',fg='white',font=16)
b2.grid(row=3,columns=1)

labelServer = Label(app,  text  = "Pour  resoudre le  problème  de sécurité inform


atique Côté  Server",bg='#5d7a70',font=16)
labelServer.grid(row=0,columns=25)

"""labelServer1 =  Label(app, text =  'pServer  = '+str(p),bg='#5d7a70',font=16)


labelServer1.grid(row=4,columns=25)"""

Mini projet : sécurité informatique|13


labelServer2 = Label(app, text =  'LServer1 =  '+str(l1server),bg='#5d7a70',font=
16)
labelServer2.grid(row=5,columns=25)

"""labelServer3 =  Label(app, text =  'Q1 =  '+str(Q1),bg='#5d7a70',font=16)


labelServer3.grid(row=6,columns=25)"""
"""
bServer1  = Button(app,text='Générer  triplets',command =  coder,bg='green',fo
nt=16)
bServer1.grid(row=2,columns=25)
"""
bServer2 = Button(app,text='Générer un  nombre  aléatoire Serveur',command 
= genPremServeur  ,bg='#5dc04d',fg='white',font=16)
bServer2.grid(row=3,columns=20)

labelPuissanceClient = Label(app, text =  'La clé du  client  = '+str(puissanceClien


t),bg='#5d7a70',font=16)
labelPuissanceClient.grid(row=8,columns=1)

labelPuissanceServeur = Label(app, text =  'La clé du  serveur  = '+str(puissanceS


erver),bg='#5d7a70',font=16)
labelPuissanceServeur.grid(row=8,columns=20)

bCle = Button(app,text='Générer les clé',command  = puisaance,bg='#5dc04d',f
g='white',font=16)
bCle.grid(row=9,columns=10)

labelCrypt = Label(app, text =  "Entrer le  méssage  à crypter : ",bg='#5d7a70',f


ont=16)
labelCrypt.grid(row=13,columns=1)

saisieCrypt = Entry(app,  width=50, show='*',font=16)
saisieCrypt.grid(row=14,columns=1)
saisieCrypt.focus_force()

bCrypt = Button(app,text='Crypter  le méssage',command  = crypt  ,bg='#e21918


',activebackground='#5d7a70', fg='white',font=16)
bCrypt.grid(row=15,columns=1)

Mini projet : sécurité informatique|14


bDecrypt = Button(app,text='Decrypter le  méssage',command =  decrypt  ,bg='#
e21918',activebackground='#5d7a70',  fg='white',font=16)
bDecrypt.grid(row=15,columns=20)

labelVerify = Label(app, text =  "Aucun  méssage  à crypter",bg='#5d7a70',font=


16)
labelVerify.grid(row=16,columns=1)

labelVerify2 = Label(app, text =  "En  attente  de message à  décrypter",bg='#5d


7a70',font=16)
labelVerify2.grid(row=16,columns=20)

app.grid_columnconfigure(4,minsize=1000)
app.mainloop()

Codes annexes à l’interface :


 Code pour générer les nombres premiers
import random

Mini projet : sécurité informatique|15


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:
        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))

 Code pour générer un triplet pythagoricien à partir d’un entier


import random

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:

Mini projet : sécurité informatique|16


        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))

 Code de cryptage et de décryptage du message


from generatePythTriplet import singlePythTriplet 

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

Vous aimerez peut-être aussi