ajout de tous les cours et TP préparés cet été
This commit is contained in:
114
Sécurité/exemples/chiffrement_rsa2.py
Executable file
114
Sécurité/exemples/chiffrement_rsa2.py
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Wed Feb 3 12:41:14 2021
|
||||
|
||||
@author: pjoulaud
|
||||
"""
|
||||
|
||||
BLOC_ASCII = 2
|
||||
CLE_PRIV_P = 53
|
||||
CLE_PRIV_Q = 97
|
||||
CLE_PUB_E = 11
|
||||
CLE_PUB_N = CLE_PRIV_P * CLE_PRIV_Q
|
||||
|
||||
|
||||
def car_to_fig(chaine : str) -> str:
|
||||
"""
|
||||
Transforme une chaine de caractères en une chaine de caractères
|
||||
correspondant à leurs numéros d' ordre.
|
||||
Attention ! Chaque numéro d' ordre est codé sur BLOC_ASCII chiffres
|
||||
Arguments : chaine, chaine à coder de type str
|
||||
Retourne : nombre, une chaine de caractères avec tous les numéros d' ordre
|
||||
>>> car_to_fig('A')
|
||||
'01'
|
||||
>>> car_to_fig('ABZ')
|
||||
'010226'
|
||||
"""
|
||||
nombre = ""
|
||||
liste = []
|
||||
for i in chaine :
|
||||
ordre = str(ord(i)-ord('A')+1)
|
||||
while len(ordre)%BLOC_ASCII != 0:
|
||||
ordre = '0'+ordre
|
||||
liste.append(ordre)
|
||||
#print(liste)
|
||||
nombre = "".join(liste)
|
||||
return nombre
|
||||
|
||||
def chiffrement(chaine, bloc=3, e=CLE_PUB_E, n=CLE_PUB_N):
|
||||
"""
|
||||
Transforme une chaine de caractères en une chaine de caractères
|
||||
correspondant à leurs numéros d' ordre codés.
|
||||
Chaque numéro est séparé par un espace
|
||||
Arguments : chaine, chaine à coder de type str
|
||||
Retourne : nombre, une chaine de caractères avec les numéros codés
|
||||
>>> chiffrement('A')
|
||||
'1689'
|
||||
>>> chiffrement('ABZ')
|
||||
'755 2705'
|
||||
"""
|
||||
chaine_num = car_to_fig(chaine)
|
||||
while len(chaine_num)%bloc != 0 :
|
||||
chaine_num = '0'+chaine_num
|
||||
print("code du message initial :\n",chaine_num)
|
||||
liste = []
|
||||
for i in range(len(chaine_num)//bloc):
|
||||
morceau_chaine_num = chaine_num[i*bloc:(i+1)*bloc]
|
||||
morceau_chaine_num = int(morceau_chaine_num)
|
||||
morceau_chaine_num = morceau_chaine_num**e
|
||||
morceau_chaine_num = morceau_chaine_num%n
|
||||
liste.append(str(morceau_chaine_num))
|
||||
code = " ".join(liste)
|
||||
print("code du message chiffre :\n", code)
|
||||
return code
|
||||
|
||||
def dechiffrement(chaine_num, bloc=3, e=CLE_PUB_E, n=CLE_PUB_N, p=CLE_PRIV_P, q=CLE_PRIV_Q):
|
||||
"""
|
||||
Transforme une chaine de caractères correspondant à leurs numéros d' ordre
|
||||
codés en message décodé.
|
||||
Arguments : chaine_num, chaine de codes de type str
|
||||
Retourne : message, une chaine de caractères avec le message décodé
|
||||
>>> dechiffrement(chiffrement('A'))
|
||||
'A'
|
||||
>>> dechiffrement(chiffrement('ABZ'))
|
||||
'ABZ'
|
||||
"""
|
||||
nombre = 1
|
||||
# PARTIE LA PLUS DIFFICILE
|
||||
# Il faut déterminer e tel que e.d = 1 mod [(p-1)(q-1)]
|
||||
# Mon astuce : On incrémente de (p-1)(q-1) jusqu' à obtenir un nombre
|
||||
# divisible par e
|
||||
while nombre%e != 0 :
|
||||
nombre += (p-1)*(q-1)
|
||||
d = nombre//e
|
||||
liste_num = chaine_num.split(' ')
|
||||
liste_decod = []
|
||||
for i in liste_num :
|
||||
decode = (int(i)**d) % n
|
||||
decode = str(decode)
|
||||
while len(decode)%bloc != 0:
|
||||
decode = '0'+decode
|
||||
liste_decod.append(decode)
|
||||
chaine_decode = ''.join(liste_decod)
|
||||
message = ""
|
||||
while len(chaine_decode)%BLOC_ASCII != 0:
|
||||
chaine_decode = '0' + chaine_decode
|
||||
print("code du message dechiffre : \n",chaine_decode)
|
||||
for i in range(len(chaine_decode)//BLOC_ASCII, 0, -1):
|
||||
morceau_chaine_num = chaine_decode[(i-1)*BLOC_ASCII:i*BLOC_ASCII]
|
||||
morceau_chaine_num = int(morceau_chaine_num)
|
||||
if morceau_chaine_num != 0:
|
||||
message = chr(morceau_chaine_num+ord('A')-1) + message
|
||||
print("Message dechiffre :\n", message)
|
||||
return message
|
||||
|
||||
if __name__=='__main__':
|
||||
if (CLE_PRIV_P-1)*(CLE_PRIV_Q-1)%CLE_PUB_E == 0:
|
||||
raise Exception("e n' est pas premier avec (p-1)(q-1)")
|
||||
chaine_depart = 'ABONJOURLESFRANCAISESETLESFRANCAIS'
|
||||
print("chaine de depart : ",chaine_depart)
|
||||
mon_code = chiffrement(chaine_depart, bloc=4)
|
||||
#print("code : ", mon_code)
|
||||
mon_message = dechiffrement(mon_code, bloc=4)
|
||||
print('message : ', mon_message)
|
||||
Reference in New Issue
Block a user