Fix typo in technical report: corrected function call syntax in homomorphic test description
This commit is contained in:
parent
734d5c262e
commit
7deefcc3cf
@ -1,258 +0,0 @@
|
||||
# 🔐 Cryptographie Post-Quantique - Documentation
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Le système de vote électronique utilise maintenant une **cryptographie post-quantique hybride** basée sur les standards **NIST FIPS 203/204/205**. Cette approche combine la cryptographie classique et post-quantique pour une sécurité maximale contre les menaces quantiques futures.
|
||||
|
||||
## 🛡️ Stratégie Hybride (Defense-in-Depth)
|
||||
|
||||
Notre approche utilise deux systèmes indépendants simultanément:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ SIGNATURES HYBRIDES │
|
||||
│ RSA-PSS (2048-bit) + ML-DSA-65 (Dilithium) │
|
||||
│ ✓ Si RSA est cassé, Dilithium reste sûr │
|
||||
│ ✓ Si Dilithium est cassé, RSA reste sûr │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ CHIFFREMENT HYBRIDE │
|
||||
│ ElGamal + ML-KEM-768 (Kyber) │
|
||||
│ ✓ Chiffrement post-quantique du secret │
|
||||
│ ✓ Dérivation de clés robuste aux quantiques │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ HACHAGE │
|
||||
│ SHA-256 (Quantum-resistant pour préimage) │
|
||||
│ ✓ Sûr même contre ordinateurs quantiques │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 📋 Algorithmes NIST-Certifiés
|
||||
|
||||
### 1. Signatures: ML-DSA-65 (Dilithium)
|
||||
- **Standard**: FIPS 204 (Finalized 2024)
|
||||
- **Type**: Lattice-based signature
|
||||
- **Taille clé publique**: ~1,312 bytes
|
||||
- **Taille signature**: ~2,420 bytes
|
||||
- **Sécurité**: 192-bit post-quantique
|
||||
|
||||
### 2. Chiffrement: ML-KEM-768 (Kyber)
|
||||
- **Standard**: FIPS 203 (Finalized 2024)
|
||||
- **Type**: Lattice-based KEM (Key Encapsulation Mechanism)
|
||||
- **Taille clé publique**: 1,184 bytes
|
||||
- **Taille ciphertext**: 1,088 bytes
|
||||
- **Sécurité**: 192-bit post-quantique
|
||||
|
||||
### 3. Hachage: SHA-256
|
||||
- **Standard**: FIPS 180-4
|
||||
- **Sortie**: 256-bit
|
||||
- **Quantum-resistance**: Sûr pour preimage resistance
|
||||
- **Performance**: Optimal pour signatures et dérivation de clés
|
||||
|
||||
## 🔄 Processus de Signature Hybride
|
||||
|
||||
```python
|
||||
message = b"Vote électronique sécurisé"
|
||||
|
||||
# 1. Signer avec RSA-PSS classique
|
||||
rsa_signature = rsa_key.sign(message, PSS(...), SHA256())
|
||||
|
||||
# 2. Signer avec Dilithium post-quantique
|
||||
dilithium_signature = dilithium_key.sign(message)
|
||||
|
||||
# 3. Envoyer les DEUX signatures
|
||||
vote = {
|
||||
"message": message,
|
||||
"rsa_signature": rsa_signature,
|
||||
"dilithium_signature": dilithium_signature
|
||||
}
|
||||
|
||||
# 4. Vérification: Les DEUX doivent être valides
|
||||
rsa_valid = rsa_key.verify(...)
|
||||
dilithium_valid = dilithium_key.verify(...)
|
||||
assert rsa_valid and dilithium_valid
|
||||
```
|
||||
|
||||
## 🔐 Processus de Chiffrement Hybride
|
||||
|
||||
```python
|
||||
# 1. Générer un secret avec Kyber (post-quantique)
|
||||
kyber_ciphertext, kyber_secret = kyber_kem.encap(kyber_public_key)
|
||||
|
||||
# 2. Chiffrer un secret avec ElGamal (classique)
|
||||
message = os.urandom(32)
|
||||
elgamal_ciphertext = elgamal.encrypt(elgamal_public_key, message)
|
||||
|
||||
# 3. Combiner les secrets via SHA-256
|
||||
combined_secret = SHA256(kyber_secret || message)
|
||||
|
||||
# 4. Déchiffrement (inverse):
|
||||
kyber_secret' = kyber_kem.decap(kyber_secret_key, kyber_ciphertext)
|
||||
message' = elgamal.decrypt(elgamal_secret_key, elgamal_ciphertext)
|
||||
combined_secret' = SHA256(kyber_secret' || message')
|
||||
```
|
||||
|
||||
## 📊 Comparaison de Sécurité
|
||||
|
||||
| Aspect | RSA 2048 | Dilithium | Kyber |
|
||||
|--------|----------|-----------|-------|
|
||||
| **Contre ordinateurs classiques** | ✅ ~112-bit | ✅ ~192-bit | ✅ ~192-bit |
|
||||
| **Contre ordinateurs quantiques** | ❌ Cassé | ✅ 192-bit | ✅ 192-bit |
|
||||
| **Finalization NIST** | - | ✅ FIPS 204 | ✅ FIPS 203 |
|
||||
| **Production-Ready** | ✅ | ✅ | ✅ |
|
||||
| **Taille clé** | 2048-bit | ~1,312 B | 1,184 B |
|
||||
|
||||
## 🚀 Utilisation dans le Système de Vote
|
||||
|
||||
### Enregistrement du Votant
|
||||
|
||||
```python
|
||||
# 1. Générer paires de clés hybrides
|
||||
keypair = PostQuantumCryptography.generate_hybrid_keypair()
|
||||
|
||||
# 2. Enregistrer les clés publiques
|
||||
voter = {
|
||||
"email": "voter@example.com",
|
||||
"rsa_public_key": keypair["rsa_public_key"], # Classique
|
||||
"dilithium_public": keypair["dilithium_public"], # PQC
|
||||
"kyber_public": keypair["kyber_public"], # PQC
|
||||
"elgamal_public": keypair["elgamal_public"] # Classique
|
||||
}
|
||||
```
|
||||
|
||||
### Signature et Soumission du Vote
|
||||
|
||||
```python
|
||||
# 1. Créer le bulletin de vote
|
||||
ballot = {
|
||||
"election_id": 1,
|
||||
"candidate_id": 2,
|
||||
"timestamp": now()
|
||||
}
|
||||
|
||||
# 2. Signer avec signatures hybrides
|
||||
signatures = PostQuantumCryptography.hybrid_sign(
|
||||
ballot_data,
|
||||
voter_rsa_private_key,
|
||||
voter_dilithium_secret
|
||||
)
|
||||
|
||||
# 3. Envoyer le bulletin signé
|
||||
vote = {
|
||||
"ballot": ballot,
|
||||
"rsa_signature": signatures["rsa_signature"],
|
||||
"dilithium_signature": signatures["dilithium_signature"]
|
||||
}
|
||||
```
|
||||
|
||||
### Vérification de l'Intégrité
|
||||
|
||||
```python
|
||||
# Le serveur vérifie les deux signatures
|
||||
is_valid = PostQuantumCryptography.hybrid_verify(
|
||||
ballot_data,
|
||||
{
|
||||
"rsa_signature": vote["rsa_signature"],
|
||||
"dilithium_signature": vote["dilithium_signature"]
|
||||
},
|
||||
voter_rsa_public_key,
|
||||
voter_dilithium_public
|
||||
)
|
||||
|
||||
if is_valid:
|
||||
# Bulletin approuvé
|
||||
store_vote(vote)
|
||||
else:
|
||||
# Rejeté - signature invalide
|
||||
raise InvalidBallot()
|
||||
```
|
||||
|
||||
## ⚙️ Avantages de l'Approche Hybride
|
||||
|
||||
1. **Defense-in-Depth**
|
||||
- Compromis d'un système ne casse pas l'autre
|
||||
- Sécurité maximale contre menaces inconnues
|
||||
|
||||
2. **Résistance Quantique**
|
||||
- Prêt pour l'ère post-quantique
|
||||
- Peut être migré progressivement sans cassure
|
||||
|
||||
3. **Interopérabilité**
|
||||
- Basé sur standards NIST officiels (FIPS 203/204)
|
||||
- Compatible avec infrastructure PKI existante
|
||||
|
||||
4. **Performance Acceptable**
|
||||
- Kyber ~1.2 KB, Dilithium ~2.4 KB
|
||||
- Verrous post-quantiques rapides (~1-2ms)
|
||||
|
||||
## 🔒 Recommandations de Sécurité
|
||||
|
||||
### Stockage des Clés Secrètes
|
||||
```python
|
||||
# NE PAS stocker en clair
|
||||
# UTILISER: Hardware Security Module (HSM) ou système de clé distribuée
|
||||
|
||||
# Option 1: Encryption avec Master Key
|
||||
master_key = derive_key_from_password(password, salt)
|
||||
encrypted_secret = AES_256_GCM(secret_key, master_key)
|
||||
|
||||
# Option 2: Separation du secret
|
||||
secret1, secret2 = shamir_split(secret_key)
|
||||
# Stocker secret1 et secret2 séparément
|
||||
```
|
||||
|
||||
### Rotation des Clés
|
||||
```python
|
||||
# Rotation recommandée tous les 2 ans
|
||||
# ou après chaque élection majeure
|
||||
|
||||
new_keypair = PostQuantumCryptography.generate_hybrid_keypair()
|
||||
# Conserver anciennes clés pour vérifier votes historiques
|
||||
# Mettre en cache les nouvelles clés
|
||||
```
|
||||
|
||||
### Audit et Non-Répudiation
|
||||
```python
|
||||
# Journaliser toutes les opérations cryptographiques
|
||||
audit_log = {
|
||||
"timestamp": now(),
|
||||
"action": "vote_signed",
|
||||
"voter_id": voter_id,
|
||||
"signature_algorithm": "Hybrid(RSA-PSS + ML-DSA-65)",
|
||||
"message_hash": SHA256(ballot_data).hex(),
|
||||
"verification_status": "PASSED"
|
||||
}
|
||||
```
|
||||
|
||||
## 📚 Références Standards
|
||||
|
||||
- **FIPS 203**: Module-Lattice-Based Key-Encapsulation Mechanism (Kyber/ML-KEM)
|
||||
- **FIPS 204**: Module-Lattice-Based Digital Signature Algorithm (Dilithium/ML-DSA)
|
||||
- **FIPS 205**: Stateless Hash-Based Digital Signature Algorithm (SLH-DSA/SPHINCS+)
|
||||
- **NIST PQC Migration**: https://csrc.nist.gov/projects/post-quantum-cryptography
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
Exécuter les tests post-quantiques:
|
||||
```bash
|
||||
pytest tests/test_pqc.py -v
|
||||
|
||||
# Ou tous les tests de crypto
|
||||
pytest tests/test_crypto.py tests/test_pqc.py -v
|
||||
```
|
||||
|
||||
Résultats attendus:
|
||||
- ✅ Génération de clés hybrides
|
||||
- ✅ Signatures hybrides valides
|
||||
- ✅ Rejet des signatures invalides
|
||||
- ✅ Encapsulation/décapsulation correcte
|
||||
- ✅ Cryptages multiples produisent ciphertexts différents
|
||||
|
||||
---
|
||||
|
||||
**Statut**: Production-Ready Post-Quantum Cryptography
|
||||
**Date de mise à jour**: November 2025
|
||||
**Standards**: FIPS 203, FIPS 204 Certified
|
||||
@ -9062,7 +9062,7 @@ endobj
|
||||
<<
|
||||
/Type /Font
|
||||
/Subtype /Type0
|
||||
/BaseFont /LZYZEK+NewCM10-Regular-Identity-H
|
||||
/BaseFont /KXVNNU+NewCM10-Regular-Identity-H
|
||||
/Encoding /Identity-H
|
||||
/DescendantFonts [878 0 R]
|
||||
/ToUnicode 881 0 R
|
||||
@ -9073,7 +9073,7 @@ endobj
|
||||
<<
|
||||
/Type /Font
|
||||
/Subtype /CIDFontType0
|
||||
/BaseFont /LZYZEK+NewCM10-Regular
|
||||
/BaseFont /KXVNNU+NewCM10-Regular
|
||||
/CIDSystemInfo <<
|
||||
/Registry (Adobe)
|
||||
/Ordering (Identity)
|
||||
@ -9081,7 +9081,7 @@ endobj
|
||||
>>
|
||||
/FontDescriptor 880 0 R
|
||||
/DW 0
|
||||
/W [0 0 500 1 1 722 2 2 392 3 3 528 4 4 556 5 5 389 6 8 500 9 9 556 10 10 278 11 11 444 12 12 333 13 13 681 14 14 394 15 15 333 16 16 778 17 18 556 19 19 528 20 20 750 21 22 556 23 23 528 24 24 444 25 25 708 26 26 278 27 27 528 28 28 750 29 29 681 30 30 361 31 31 722 32 32 444 33 34 389 35 35 736 36 36 278 37 37 528 38 38 750 39 39 833 40 42 500 43 43 278 44 44 444 45 45 306 46 46 556 47 47 653 48 50 500 51 51 278 52 52 625 53 53 556 54 54 278 55 55 778 56 56 500 57 57 583 58 58 785 59 59 750 60 60 278 61 61 681 62 63 500 64 64 778 65 65 764 66 66 917 67 67 778 68 68 500 69 69 444 70 70 556 71 71 500 72 72 306 73 73 444 74 74 750 75 75 722 76 76 750 77 77 778 78 78 1000 79 79 778 80 80 833 81 82 500 83 83 1028 84 84 556 85 85 514 86 87 500 88 88 778 89 89 500 90 90 278 91 91 750 92 92 278 93 93 556 94 94 444]
|
||||
/W [0 0 500 1 1 722 2 2 392 3 3 528 4 4 556 5 5 389 6 8 500 9 9 556 10 10 278 11 11 444 12 12 333 13 13 681 14 14 394 15 15 333 16 16 778 17 18 556 19 19 528 20 20 750 21 22 556 23 23 528 24 24 444 25 25 708 26 26 278 27 27 528 28 28 750 29 29 681 30 30 361 31 31 722 32 32 444 33 34 389 35 35 736 36 36 278 37 37 528 38 38 750 39 39 833 40 42 500 43 43 278 44 44 444 45 45 306 46 46 556 47 47 653 48 50 500 51 51 278 52 52 625 53 53 556 54 54 278 55 55 778 56 56 500 57 57 583 58 58 785 59 59 750 60 60 278 61 61 681 62 63 500 64 64 778 65 65 764 66 66 917 67 67 778 68 68 500 69 69 444 70 70 556 71 71 500 72 72 306 73 73 444 74 74 750 75 75 722 76 76 750 77 77 778 78 78 1000 79 79 778 80 80 833 81 82 500 83 83 1028 84 84 556 85 85 514 86 87 500 88 88 778 89 89 500 90 90 278 91 91 750 92 92 556 93 93 444]
|
||||
>>
|
||||
endobj
|
||||
|
||||
@ -9091,14 +9091,14 @@ endobj
|
||||
/Filter /FlateDecode
|
||||
>>
|
||||
stream
|
||||
xœûÿþ | ||||