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

89 lines
3.4 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 7 20:03:19 2021
@author: pjoulaud
"""
from random import randint
def genere_table():
"""
Fonction qui génère aléatoirement une table de correspondance entre lettres
Les clés correspondent à chaque lettre de l' alphabet et les valeurs à une
autre lettre prise au hasard.
Arguments :
- Aucun
Retourne :
- dico_chiffrement de type dict
>>> toto = list(genere_table().keys())
>>> toto.sort()
>>> print(toto)
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
>>> toto = list(genere_table().values())
>>> toto.sort()
>>> print(toto)
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
"""
dico_chiffrement = {}
toutes_les_lettres = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z')
liste_lettres = list(toutes_les_lettres)
for lettre in toutes_les_lettres:
position = randint(0, len(liste_lettres)-1)
lettre_correspondante = liste_lettres[position]
dico_chiffrement[lettre] = lettre_correspondante
liste_lettres.remove(lettre_correspondante)
return dico_chiffrement
def code_par_substitution(texte, table):
"""
Fonction qui code un message grâce à une table de correspondance.
Arguments :
- texte : Message à coder de type str
- table : Table de correspondance de type dict
Retourne :
- texte_chiffre : Message codé de type str
>>> ma_table = {'A': 'H', 'B': 'A', 'C': 'F', 'D': 'M', 'E': 'D', 'F': 'T',\
'G': 'Z', 'H': 'W', 'I': 'L', 'J': 'X', 'K': 'G', 'L': 'S', 'M': 'I',\
'N': 'V', 'O': 'R', 'P': 'C', 'Q': 'O', 'R': 'E', 'S': 'N', 'T': 'Y',\
'U': 'U', 'V': 'K', 'W': 'B', 'X': 'J', 'Y': 'Q', 'Z': 'P'}
>>> code_par_substitution("BONJOUR TOUT LE MONDE", ma_table)
'ARVXRUE YRUY SD IRVMD'
"""
texte_chiffre = ""
for lettre in texte :
if lettre in ('A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z'):
texte_chiffre += table[lettre]
else:
texte_chiffre += lettre
return texte_chiffre
def decode_par_substitution(texte, table):
"""
Fonction qui décode un message grâce à une table de correspondance.
Arguments :
- texte : Message codé de type str
- table : Table de correspondance de type dict
Retourne :
- texte_chiffre : Message décodé de type str
>>> ma_table = genere_table()
>>> decode_par_substitution(code_par_substitution("BONJOUR TOUT LE MONDE", ma_table), ma_table)
'BONJOUR TOUT LE MONDE'
"""
nouvelle_table = {}
for cle, valeur in table.items():
nouvelle_table[valeur]=cle
return code_par_substitution(texte, nouvelle_table)
if __name__=='__main__':
import doctest
doctest.testmod()
#ma_table_chiffrement = genere_table()
#print(ma_table_chiffrement)
#message_code = code_par_substitution("BONJOUR TOUT LE MONDE", ma_table_chiffrement)
#print(message_code)
#message_decode = decode_par_substitution(message_code, ma_table_chiffrement)
#print(message_decode)