115 lines
3.8 KiB
Python
115 lines
3.8 KiB
Python
|
|
#!/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)
|