Files
TermNSI/Sécurité/exemples/chiffrement_rsa2.py

115 lines
3.8 KiB
Python
Raw Normal View History

#!/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)