Vous développez un gestionnaire de mots de passe simplifié, similaire à **Bitwarden**, **1Password** ou **KeePass**. Ce type d'application permet de stocker de manière sécurisée tous ses identifiants en les chiffrant avec un mot de passe maître.
L'objectif est de comprendre les mécanismes de chiffrement symétrique et les bonnes pratiques de sécurité.
---
## Objectifs
- Implémenter un chiffrement symétrique simple
- Comprendre le rôle du mot de passe maître
- Stocker et récupérer des données chiffrées
- Générer des mots de passe robustes
---
## Partie 1 : Chiffrement XOR
### 1.1. Principe du XOR
L'opération XOR (ou exclusif) est fondamentale en cryptographie. Elle possède une propriété intéressante :
```
A XOR B XOR B = A
```
Autrement dit, appliquer deux fois XOR avec la même clé redonne le message original.
### 1.2. Implémentation
Implémenter la fonction de chiffrement XOR :
```python
defxor_chiffrement(message,cle):
"""
Chiffre ou déchiffre un message avec XOR.
:param message: (str) Le message à traiter
:param cle: (str) La clé de chiffrement
:return: (str) Le message chiffré/déchiffré
"""
resultat=""
fori,caractereinenumerate(message):
# Récupérer le caractère de la clé (cyclique)
cle_char=cle[i%len(cle)]
# Appliquer XOR
nouveau_char=chr(ord(caractere)^ord(cle_char))
resultat+=nouveau_char
returnresultat
```
**Test** :
```python
>>>message="Bonjour le monde"
>>>cle="secret"
>>>chiffre=xor_chiffrement(message,cle)
>>>print(chiffre)# Caractères illisibles
>>>xor_chiffrement(chiffre,cle)# Déchiffrement
'Bonjour le monde'
```
### 1.3. Questions
1. Pourquoi la clé est-elle utilisée de manière cyclique ?
2. Que se passe-t-il si la clé est aussi longue que le message ?
3. Pourquoi XOR seul n'est-il pas suffisamment sécurisé ?
---
## Partie 2 : Classe MotDePasse
### 2.1. Structure d'une entrée
Créer une classe pour représenter un mot de passe stocké :
```python
classMotDePasse:
"""Représente un identifiant stocké."""
def__init__(self,site,identifiant,mot_de_passe):
"""
Initialise une entrée.
:param site: (str) Nom du site/service
:param identifiant: (str) Nom d'utilisateur ou email
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International</a>.