-
Notifications
You must be signed in to change notification settings - Fork 0
/
Principal.py
138 lines (129 loc) · 5.88 KB
/
Principal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# =============================================================================
# Titre : Principal.py
# Description : Librairie permettant d'encoder et de décoder des chaines selon
# divers types d'encodage.
# Auteur : Nicolas Bisson
# Date : 2015/02/23
# Version : 1.0
# Usage : python3 Principal.py
# Notes :
# python_version : 3.4.0
# =============================================================================
def encodeur(distance, chaine):
''' Fonction qui prends une chaine de caractère et l'encode selon
la distance déterminée par l'usager. Elle retourne la chaine, encodée ou
décodée, dans une liste.
'''
minuscule = "abcdefghijklmnopqrstuvwxyz"
majuscule = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if isinstance(distance, str or float or list):
raise ValueError("La distance doit être un entier positif")
if isinstance(chaine, int or float):
raise ValueError("Le message doit être une chaine de caractère")
listeChaine = list(chaine)
for lettre in range(len(listeChaine)):
if listeChaine[lettre] in minuscule:
positionLettre = minuscule.index(listeChaine[lettre])
listeChaine[lettre] = minuscule[(positionLettre + distance)%26]
elif listeChaine[lettre] in majuscule:
positionLettre = majuscule.index(listeChaine[lettre])
listeChaine[lettre] = majuscule[(positionLettre + distance)%26]
else:
pass
chaine = "".join(listeChaine)
return chaine
def creerEncodeurCesar(distance):
''' Fonction qui prends la distance d'encodage de César et qui retourne
une fonction lambda permettant l'encodage de la chaine.
'''
if isinstance(distance, str or float or list):
raise ValueError("La distance doit être un entier positif")
elif distance < 0:
raise ValueError("La distance doit être un entier positif")
encodeurC = lambda chaine: encodeur(distance, chaine)
return encodeurC
def creerDecodeurCesar(distance):
''' Fonction qui prends la distance d'encodage de César et qui retourne
une fonction lambda permettant le décodage de la chaine encodée.
'''
if isinstance(distance, str or float or list):
raise ValueError("La distance doit être un entier positif")
elif distance < 0:
raise ValueError("La distance doit être un entier positif")
decodeurC = lambda listeChaine: encodeur((distance*-1), listeChaine)
return decodeurC
def creerRot13():
''' Fonction qui retourne une fonction lambda permettant l'encodage et
le décodage à l'aide de la méthode de César, mais avec une distance de 13.
'''
encodeurDecodeurROT = lambda chaine: encodeur(13, chaine)
return encodeurDecodeurROT
def substitutionneur(substitution, chaine, minuscule):
''' Fonction qui prends une chaine de caractère et l'encode selon
la liste prédéterminée. Elle retourne la chaine, encodée, dans une liste.
'''
if len(substitution) < 26 or len(substitution) > 26:
raise ValueError("La chaine de substitution doit avoir 26 caractères")
if isinstance(substitution, int or float):
raise ValueError("La chaine de substitution doit être un string")
if isinstance(chaine, int or float):
raise ValueError("Le message doit être une chaine de caractère")
listeChaine = list(chaine)
for lettre in range(len(listeChaine)):
if listeChaine[lettre].lower() in substitution:
positionLettre = minuscule.index(listeChaine[lettre].lower())
if str.isupper(listeChaine[lettre]):
listeChaine[lettre] = (substitution[positionLettre]).upper()
elif str.islower(listeChaine[lettre]):
listeChaine[lettre] = substitution[positionLettre]
else:
pass
chaine = "".join(listeChaine)
return chaine
def creerEncodeurSubstitution(substitution):
''' Fonction qui prends une liste prédéterminée et retourne une fonction
lambda permettant d'encoder une chaine selon cette liste.
'''
if len(substitution) < 26 or len(substitution) > 26:
raise ValueError("La chaine de substitution doit avoir 26 caractères")
if isinstance(substitution, int or float):
raise ValueError("La chaine de substitution doit être un string")
minuscule = "abcdefghijklmnopqrstuvwxyz"
encodeurS = lambda chaine: substitutionneur(substitution, chaine, minuscule)
return encodeurS
def creerDecodeurSubstitution(encodeurS):
''' Fonction qui prends une liste prédéterminée et retourne une fonction
lambda permettant de décoder une chaine selon cette liste.
'''
if callable(encodeurS):
minuscule = "abcdefghijklmnopqrstuvwxyz"
decodeurS = lambda chaineSub: substitutionneur(minuscule, chaineSub, \
encodeurS(minuscule))
else:
raise ValueError("L'argument doit être une fonction lambda")
return decodeurS
def encrypterFichier(fichier):
ligneStr = ""
fichier = open(fichier, mode = "r")
for ligne in fichier:
ligneStr += ligne
fichier.close()
return ligneStr
def crypterFichiers(fonctionLambda, *fichiers):
''' Fonction qui permet d'encoder ou de décoder, selon le type
d'encodage/décodage choisi, ce qu'il y a dans le fichier et de
le remplacer par la chaine crypter ou décrypter.
'''
if fichiers == ():
raise ValueError("Il doit y avoir au minimum un fichier")
if callable(fonctionLambda):
listeFichier = []
for nbFichier in fichiers:
listeFichier.append(encrypterFichier(nbFichier))
print(listeFichier)
else:
raise ValueError("L'argument doit être une fonction lambda")
for fichier in fichiers:
nouvFichier = open(fichier, mode = "w", encoding = "UTF-8")
nouvFichier.write(fonctionLambda(fichier))
nouvFichier.close()