From 7deefcc3cfcf54075979ca898bff0df4c8a3cb37 Mon Sep 17 00:00:00 2001 From: E-Voting Developer Date: Tue, 11 Nov 2025 21:57:16 +0100 Subject: [PATCH] Fix typo in technical report: corrected function call syntax in homomorphic test description --- e-voting-system/docs/POSTQUANTUM_CRYPTO.md | 258 --------------- e-voting-system/rapport/technical_report.pdf | 316 ++++++++++--------- e-voting-system/rapport/technical_report.typ | 2 +- 3 files changed, 169 insertions(+), 407 deletions(-) delete mode 100644 e-voting-system/docs/POSTQUANTUM_CRYPTO.md diff --git a/e-voting-system/docs/POSTQUANTUM_CRYPTO.md b/e-voting-system/docs/POSTQUANTUM_CRYPTO.md deleted file mode 100644 index 7f6fdb4..0000000 --- a/e-voting-system/docs/POSTQUANTUM_CRYPTO.md +++ /dev/null @@ -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 diff --git a/e-voting-system/rapport/technical_report.pdf b/e-voting-system/rapport/technical_report.pdf index 7df53c1..0876dc7 100644 --- a/e-voting-system/rapport/technical_report.pdf +++ b/e-voting-system/rapport/technical_report.pdf @@ -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 -xM +xM endstream endobj 880 0 obj << /Type /FontDescriptor - /FontName /LZYZEK+NewCM10-Regular + /FontName /KXVNNU+NewCM10-Regular /Flags 131076 /FontBBox [-40 -250 1009 917] /ItalicAngle 0 @@ -9113,7 +9113,7 @@ endobj 881 0 obj << - /Length 1942 + /Length 1928 /Type /CMap /WMode 0 >> @@ -9140,7 +9140,7 @@ end def 1 begincodespacerange <0000> endcodespacerange -94 beginbfchar +93 beginbfchar <0001> <0043> <0002> <0072> <0003> <0079> @@ -9232,9 +9232,8 @@ endcodespacerange <0059> <00F4> <005A> <007C> <005B> <0058> -<005C> <005B> -<005D> <0066006C> -<005E> <00E7> +<005C> <0066006C> +<005D> <00E7> endbfchar endcmap CMapName currentdict /CMap defineresource pop @@ -9247,41 +9246,54 @@ endobj 882 0 obj << - /Length 8655 + /Length 8623 /Filter /FlateDecode /Subtype /CIDFontType0C >> stream -xzTTWÝ{lr&&DcFXbl7^"Cf }e` --cZ) A__-ְrνs~g?e2\mo5|-vm KrL ٍKCL&wa Lޭnmv{Y˕*qfMs7{xD Q' 3j8~!~^˂}}BG8/Y#9d˗.s/ypg`!!G x/$xOǠyg/|{sg7F8orr3Oly_;tߥ n.ݾ쾶{h{|ڳ^e/rsNNWxwBosʞϯ}@u}24ż=.._9߳2-@>6pD@ަvQ<+wF9UB_1F.HJBVHd!3[V -.XJqo{FVl%FZ<9K2_S*9Q]j-0d&QRvJ^C):5`7F0u$;,B5Zݩ3HEϸR4ِ?}q&aD}vX}JR y-LrvJ*z(@r_#a߁bJpHJ@xiR^yD8'O%Mc*5Q+DfQVGS*B!Sa*m hatm;.e$nTmm;L@dhp -d1iMxyki7&N$1 PB0圪: -{c)V\_x9x1Ȋ/X9O-czl_ -(,7.Hj2Ѱ9R_ */WViE^ywPH޸GAhwk^q(v!'Ƀ',ll\aciA/߿ҽ@>Mk+,pɩeee1e8c>vRh9V+EH˜BlLtD8uq3i`̞ khm|r=İ۽]~ˏG -PutU6+$SCET(+,io+j*]V{N &69I 1d{nL]Qwp`:J̜ʽ !ة+|W_}Y{iMtjֲ]ĂXV.Z -şZ.JnK>&:~sꂵ@&^7׷d{EeQIrjv6W9|rv _pw -ppo!HuvH{yGy0l׆5jn NT#@Xp䈝.ET[dWBw\M} -,qa''|[oΘ쏗N?g^DQèX;4?OnEvnrZ$Ýζ\J\&w21P[OI!^aAe%Vi[3עbW>;ޘ$AJbJց!VzwV+-&(~]ڋi/OCETb*Ϭ<̦/nVEU5ω!.} %I_#rSVzh!(kMC?SY솲O^TF -6*`ƘqHıoZE3cԯرN;k؆N<4V9-syN.ڊƛ mg i,)KKyTn@U1wْi$̄U[ݧD<.W $"yv;$40F0w;/?m.<%7cp!-fU/Z,g-R}f#-VgY+ā>^Aka p(AW:'yM:J r )Kes;wx)Ё -NY0A},nD5Bkъ3Ϟ>ogV"~층oΘ|u;|tct;F0쯬:KFSWEr΀uoFE57.;i'T7*} .*rYT餆DWn::Ji Q,Uc|:(u@f} Y7[V=ϊ[c[x얢յӴ:P.*ꦃx l5r֞V4󷩗h{Mxڂ[̽ܡ'T)Lu?BV,ҴÖ~B}<-mQ`"X(Ļp=*6'vBwXyH必#a ԇsXv*)wo0*nk5r.;@hw+lϊ=3UJ=5ǡvy;@Q١HQ^,E)d-yfRfs!T4@Ug 51ׇ@Lz1)r!5+5sx*+b ^s+nihnH[@̈́r&7& R/#qbPɪhuF3 #BfP ϓQrkbQrg0C^a&VGMr`:"HHwi{o)'xf2_*lX5<`3LcU{$t)B hkv v(uV̼VS*>5mTc&P( -N)M-r >FpChѝymk+J5wB1PߖGǓ?+)u_Q!69ntxaCirmDk҈;ߟRg4^荋؃3# #ٔ0E#h0LK3yِ& #O) M<\be,/B"$'C" 8t,PӶY'u$1:HLMNlN9ψ DlT\qk|:%|>!qֈ XG&יkj-\%Qgt@p~Ot .A8-Yk';n. W ?TS4<sP9S -JFd K(.$ǹn4ݷF n6N{DIBZrZεk -v`' 9IE["!Uә]{.)0Wm$ι4%3"!26:)5u&.Y%He:&lt)Ϭ[)떬](%[a @ -1%B>Xjk͍D'vB~W|uds4R̃H;hg=ujhFIL\çJ%|}ΠpV6`lζU C;R!dЧ&iX]&+Ơj0=Tߵ z\tn=v/7Q~?-g\{g@t<ӽ+gA$߄;28 -3>ATE#,=ڜƊB-eן`dD )"thDb*yfPHxI׷~Infn=;i*.|90V_L -k9<;-a5;RMgL1ό(b a+, v ޼%p=yi¹&HM|u[քje}0N6P -YYyfc,tn n^1II i -if3yz'ܽ53^gӵ1ڬèm/G4LZ||oLXOk_yR_~ A$ lgU~I 8R~qyopKu7SZC"$踾FO>!l]Vmj6 WGc>ؾ3aWBmZ=sV^|\w^_ώR}]GcZ,zDT !k8K?Kky9Lͣ5]h4 Z5oe?Sc c{CQuS.--.!eY#w˵Jq.:ӝ>k{C_p6KxXb:v: /jF!&eqFߵ^ }>8% z% (+?UwF+n=]$Z` ( 8(PW?UO 9Տ7ei(Hͯ3hHmV 5۔M3\H *Q҄ɱaċl G -qL`183E;] cMllO vSNlo>Rf*/8ϯmvz>K(?Vל~FA^~|06@P7X\ +vu7ɂ|5`R. uկՙYw} c@x]bJ"BR$٭`DS73 'DvJ'8BЩGTruĤEeLfKSToduM*j -!4w?5LffO쵱{!6?Y3`'KKh!!Lak;5>Ty:L(y*HM.&Anc*:~r;P:M_F2 l( z<'ʅg5wdҸvj(ՋB[fGj[cfhi8VAYO]hV`JLCu|)w<Aa%\ɲy솸ہԒlb%o:ZY c_Yu!*M%{ ^fk15YmzjCR-uty8a`OKG/|y8`T%#1"̑x&ش_{@ܕ9pzMzbZRF2\~I31;R"ԜsD~J5&ᡑn}#{%N]sdSm`}∽m/m)IZFo¡$vm(w<;n0̐Sc?jAOۏIպMZ[^Xfտ-Z=bGH[j iUTZ/˛,nU9%.@YDho  rMoSuw>+;g;8ںVƞzG e9FXk"\7l.@{}*:{Tvx4zvXn MgVH߸so\iutY/j,AcBEFtnr%ucAVu:v+" 7Xή:57KQK o ?2m̃s͗"˥09x!0%mˁ: uk aaMɎn_ٌ]v%$8Rn-**+ 5͐ -`cV$t> !2?** `ArMl>05,,c[^!2ľP)l-\MJmfNUmvZR,O -:_Xe͝{>AKx,'t 3AFrޞfC6܇[G7PPQs 0@ ^nHhƃ9!-&Y YglƎ (cII1I$"ٮ&Kfʲvrng6iϪ^o -oiuu[o1] i"!K["U!/-ؔ-J:I1%eB*X -$V {6O10BqB?T$&*w+@:d"2f -83dS2 FUOl]qԴrWxݽ_w<=#ɢnAypw"=dy@ ?/6Ʌ~$p`'T%GB Dd(L Ty|~S?Réh9,4d"0wc  +xzTTÝ{lr&&DcFO,1H/Cg>20^  yƘn5~=Cz8|2~! ==wvp0y ϑ[BGt +i7|7 _0wko.}mDHx !n^>#dN2lsj}XgN(.uNuX Fh0uhJ7Ln2L&mm`۲d2dێqm=@M^iTN+n:9|˼c*+?Q~6gH*g.u5ͥv_5@ӣm{ګ̱En.w) +_mxFL3?;ٵ賮OF\?׷G_A%CO~2쿪l[ud(c+u t4ZEAQkq|&,ɤ^|O0&:~sꂵ@&^7׷d{EeQIrjv6W9|rv5_pw -ppo!HuvH;yGy0l׆5jv NT#@Xp䈝.ET[dWBw\M} +,qa'CnO_"1/ .8μ|@~3QvTiBcOYz5H +;ImFM-Ldbj6ep.;C*|w K*juZѷg9E!Ů|v1IĔGC,]!oA VZLPz]ڋi/CETb*O<ʦoVEU5ω.} %N_crSVzh&(kMBSY솲^TF +6*`ƘqHıoZE3cԯر-V[+؆N<4V9-syN.ڊƛ mg i,)KKyTn@U1wْq$̄U[ݧD<.W $"Yv;$40F0w;/w߷m.<%7cp!-fU.Z,g-Rf"-VgY+ā>^AkaO p(AW:'yu:J r )Kes;wx)Ё +NY0A},nD5Bkъo73Ϟ>gV"~층Ϙ|u;|tct;F0쯬:KFSWIr΀uoFF\տN w +E>U:a=F1ѕν +ChoKHA>K΃w&8:;`oBwMVUAij"husZHl|E([u<O9kO+Mac4clo&U +Su]d|﷐;4Wv7%e߆Pmˁp[6gyp}T)&`.h8vf9rM%I'ppR/&}pYa\+]LyJy8ZM沜 )k]A +"xO`$4BLՁRqOqb)AT{v4RKQz9!.%9YK^\H  P&HI2&B.ff|2YeZ kCr' :'$Ȋpl>[ @h?)jh ;gүi)D2SUbOբ>L[`BTPVIMɈH%&E5}r=oM:Z!`$hC1R|:{u,j*cg3M'v+Vg4A :"duBl/ F?%D_Snw**?o@Lґe jx́yAo'rJ5Hc`*0G ec1emtH/PrkQF>}kD@``a@yl77KL!$%\`&{#8[dE!REs8ٵg +1 S| +6@KS2!"cS>d鐟Ub \.TcBa!F'Ah!OyfBHYdE)@| +h P8)!RULmn$$B\܎=t:#+IVVgDYG; PC4X*`rp o>U|(t=b6 cgvb ک +ٴ$>5H2Y1}<(VKٝp葠ׂqѩ/wVk=>n[qR~8ߕwpC/8R&&lݑ?4@xQ(9*G_*L9f04VDTlm/p|&$]WWOY6F&Ti,Z 70Br<\OL*p0#pISUpI8mabUF^^1l h8 %x1v0 +Z"g/i4ڂxex~ 9zNz@eZpJp%ˑҒĚj /rui j @I5aspd>c]i)Vq{B|f# >fR?c`]QŸVVXyKz 3`Iӄsq1Mz3Bkyv붨 \/Aɷ gyaO[xmX0"=ƒc 2 fV K4{k}Hdi7$k; "" b2Y Q۞7i'9:L=-5+^@)>?.?DH;#a? !?!&9"HHAΪrA5B#k"Nqrw +)܏'$2oo>\|, DH4?)q}Gz}B ٺ8l,6+3Ƽ}g®-`zD8NKuzfSjMu`g~QD<(:b[ ++W/ mS5t6[2 rkը~m0ӕuil)t ,.ZqwXUZxx<\#܏=1i mW%#` nɭfbRn] S ^X̀Ba_}gmTKӵI`嗀rU_|ZDQH [xs\VX],_s I͊3Cf ~ &- +D|N4arldsX' i-[Bln<=>X 0LNBm4A4ۓ@%T:۽ +. +*/T bX4:+wAf׾h/: $%7.~]nZQ 6'4w_˝"[u-\f 27vA]lIȦD$* +v^4}})Lc`F&5-{Icsdm߻&bC[D:qې 嘂 +iF]2e޼)S.̻v…kJS)/^cm~6&GW1P:lY= +Дh";aOK3z:)Oi Y_QWzzI!|$GPW܆8h 5D5=Y-ԗ^*,I~K d%j۷"킄֡BjSGlf!hg. Pz!r_pTW#b(hoqMh $Rw&S6iԁrqZ{kubt .o t un8%pb\^w3,W !5킠zm ʋ[*ZZyIqJ;/ %$:-.Lb: VAd=ul.QwdriiyOU7_CqV ApF'Fe2nkKOokBqb +vڮP,ne.w˘v Ỵ^.shv]T.S8emri9nno7O.S,ж>X.TS.z\;0_.MݦTʛAP=^=A 3A ¸i9>Ⱥ}0v|}a_y­άߕ +;.]>rP]VN? NUSC&Q!F(Ŗ0Uz/ (Vc2 6yCx2v>= 26fֵc'+p&si) 1w3 >lm҇J7Tq,OT)$MV`LYrs2үB.t@0ۨ^$A8-emۙSn?Ky\d̛ҧXOR_C[FLo0x>kTD^<&ǀޢ7;ZgWKr0o 6CNñ +ҖzbF ޶[Wfos)gus-׸e5-Juf7č/D槖NRQIóPsNqdWJҋR.)5Ee#xeV`ҿ-N@P ;gHT xCzH +ykYPI.֥΃&O2FuzKA"$EQ4k0V39z# P"8@_Gߡ +R;d!R7AGlCq,n񴈾0qP瘇9o|f,AYB1ѽ#Q?T>6]6a2ՃNIOLKH&Oz&fGJsOd==6<42mydw4sjv ^W~um:>WK_)mAW8+原FF[: 3X[pRnu lE0Gu+Y d8RK{iy *]7Chr"M!>PI;m +'epG[*6YZh`MMBh_FxNoFXXˍ̪B18_yMGEo;+^C +3HX>"p~=pj +7x.DzC{bX':̭1.}S|@:]}6D]MHiDIь>5%ȮSPaүۅ6{$B'FmxIM 0=}x󇐚ຶVgͅ<0f$_^'L} _PqZ$SHxZhg`9@+ rtXPѱÛjɣ#ycD|{Uݶz +) <ο_xEmTs0[·p=L0n"-b`%r)*L>*i4D5LIr NgCZCXGS[Wl6cp * a}[KM3B:!U)3 p +X6b![Oi( "t ؖ}EȁL3+#Ty]}] 6w `zתY޶{h;n|-~CF[ ‚/2=ؠ]`:  ~-9Iooh! g+(۹\jd /7$T N,h,h`r3 6cv1ڤ$$slWrl%3deߝt =?PܳWc/d/EyEb8BBEB=}|3շ DkC^Z4)) ZBt*q9bJʄTȱIҭ4mb`ކb H_ILTtm9Ȯ7l EeJ0[p gɦdAfe|b2%ݵ{3$ސlZ |#&3$ކJ8m΂P 0gPE!tL@ fMk B_А܍ endstream endobj @@ -9992,17 +10004,23 @@ endobj 959 0 obj << - /Length 1780 + /Length 1776 /Filter /FlateDecode >> stream -xZmo6_u }|"]^na?m& KDRQ "Y;=|[MA..j$1FQUr+×bköZ@VrItw՗t dGnUR.tnelj ]\6wS'&Y}-9,ऒO)uõA[DVq]Rj`|@2"L)ʤĂw`zAeYjμ=^VB9R}%hI%B=l[J+ - <|| : -[Ц'@H#y*dBQ-f?6 X{l:: j(3^ޤPRVOٱ&-Ҏ@1N# J1=u ҽf1B)41W &+Mͩ!EEn]uR7+YCI7c1(hwDlpf fɬ9*FExcxt?Emxi] 8ߣI[nz -`/KN}.r2@&}dV]aJuA+^"rQ{Y;* N`}ӬMmi{y[v 0!^I2* Uj]/>^#6.d%@ "3E 4̑.(,SiuUɽ].pIG\ЕW -d#JE ~l:'*5?4r'Vތ6jeC>v?eep.հۛX(X{'3|"6`^] t-`fCohChez(qF=@~p1\3GǕQ= !(La8ю ai}t\̈3A -;nU}H%f$]օ i zR#'ӬK5aMkJsbiY +xZmo6_u }|"]^na?mއ& KDRQ "Y;=|O[MA.)j$1FQUr+bKöZ@VrItwt dgnUR.tnelj ]\6wS'&Y}-9,ऒM)u}#ow V  eJNGP&E&s "-˲Զ3tTcvu"47agm#QG V@æظaGJ::_56yWpl 6߭IFbU[R:AZΣU@sIecoṣ熞T_Vޭ]]}X)pbD.yC m$9thIJ@1Pti6`>ZBŐ2^%F*>=?o;AڛhH)4v +_( + `( 0@A0U;Nv>k1g o~M#I)7\}" +p + ?p_q( &kzAhl?Z:^**:m "C::i}V9~YS Rmq'k]thG\;hNEIϗcezP%7.WfgnqbIe~UzفM=~6k%lK{VTɨ֨ cyb2 +q•&Ѽmcvv7(1jRVՊY&! H; PQD*Ol>=A|ǏuNMO4GTɄZ4~l@8t<)tVIA1ʥQfIc%M +r_ ZRɥ9.j5cGzSbT{7;렛{c^K9KShbxIA9AgYM,VSC|] ;o +W^YCI7c1(hwDlpf fɬ9*FExcxt?Emxi] 8ߣI[nz +`/KN}.r2@&}}Wcf ^qWe$:1NETgreP=cҠ;DS-%fAeWbú!i="8NJRws:_\aDզ¼V'yZpwP:?shɷx{p7 !|0Fah1DCҽ +;ʓdTԬj_|'l\ rȠK@ "#E 4̑.(,SiuE].pIGܡ+[hFr.spjێ~ta+jo}e0D>v?eep.հۛX,h{'3|&ڴ$6`^] t-`fCohcMhez(H㔲{Tpy4W,"P*3LG;&=qA#Zmҫ+UՑJ&#RI!>j >$FNYה)=xBadYt endstream endobj @@ -10032,12 +10050,14 @@ endobj /Filter /FlateDecode >> stream -xZmo6_%;) Ű0l  EGGٌ}["7瞼~a~wp#kN,V8I?6{F?5|7ۆcy`+}G>w+ym~i4T:Hwr^+nw_&d&&~wwY0UlѮ:Xv!_fdr;ZH+Gatͤ--Ff -Zb>H3N *DɨE gR\;Qϲӣ`~5) b n?`~&A@' H+ - OЭAu-Ռ9}rB894TZ=j кZ܏1`f} 6%>.r@p^VYڡP3EeN-uB]!CM8'a8d0~ Fau u -M DL%M,X( z6~@LG?5qT̝ݵhӜcF]xoKpGȇL\/ae''U%5Khw[qwd Z;hC,a?~"L -I;j܂{%(L4jt́; 7KhHv|j:7E0hD-u"u/i"#ߍ>OHin.e[Y>Ս| 4E>R+# e^`@UtB> m(xn!O;iENٷPvA 8jAC&͔!8E8yier C#2ބww<_Ht!]%l6(O7\^fmVu45`rRb~WeJ-$ }rN(Ak);87/pBM.O"V)dsޠWG(0@t{~+26ZƜ]L:cxo'_YG9#hFXX``]XYE==8W\O,ZC!)3ͪ6).zTϺa8JX6FUҸ U9v?+v r鞥11lO;&R|31\@C8TRzդ99ýuLw7+9BUƗƨY<{cxo^&ݵS5̲Ww =$/jnmRj f,-W`( u "^aJbf%u|ID5=f׉+8иWiU#gaȸAנ7[hj,zNr#WP 85zAnx#gL{$NLE擪>=ǻ%pXtpTjO(dꄹ#uv/Xi\Ie|iP>m[\AFGjGòg.GBb:"EОbBM'\#h, -&@_7Ez7TMh( I/)xB]R:$N֘qO=+A@94-lAhӴF|h$:cI~J#&?g Eb݅as"ohJjC]7h U#>k){"SޝtdcGހ(yLi_9`$N-hF0+ggf`)/_ +xZo6_#7) Ű0{j0À[EQQQ6ncKQ;sO^n\ii8a5'Qg WZMu+$=#F>m<0>O;ռ65ooM*g;I9?\r;\u/2|Ww|s?;q;,*HA^gxx6hWdy,os32H (Qk3,]3iKŴV-/dRLz +Q2$kqqtנNkԳqE뵸|h<zM +X?C kI,zS63tkPrK5cNnm+ UVzZxc` #90G39Ma 3x<׀Uv(LQnSKAݢPWHP#Ɓ:IYgߡwC"'wX]y隣B&~1yI  Jt^ 7yяdM%ri*snw-4Qׯ"FR)!,;&KXAIgrfxDR"F~oVKA_BaҎ^5 +SE͹os`DaHR&+N@M> eKE˱ĢFZϓ)Rkn)KVOu#@Mo0&aEC8+CPjU!CxB +q|~gksѧ|E0Ԁ]ZPI3eH$0Gj?Nq6fZ.cȠA7.O9Rs9qH|I> /ktsxţA**MM>-\կbv٧ReK ٨cG}nԢ(#wnpZfR˘ Zg룱904r@Ct2wk+0 kk4+3к'ܹg|jEt>4eơYwťXY4 G+҆"بJW2*8pn!ZR.ݳ4&&A }DŽTo7:HY#~4JQO3򾚴2'{ `5 `NfE8C(VRU> endobj @@ -10092,7 +10112,7 @@ endobj /Subtype /XML >> stream -Typst 0.14.0fr2025-11-11T20:48:57+01:002025-11-11T20:48:57+01:0014application/pdfqOiABtvAuy1vyxpi9itmRQ==qOiABtvAuy1vyxpi9itmRQ==proof1.7 +Typst 0.14.0fr2025-11-11T21:53:08+01:002025-11-11T21:53:08+01:0014application/pdfMVbuUUU0+4V4MHFCXBAo7Q==MVbuUUU0+4V4MHFCXBAo7Q==proof1.7 endstream endobj @@ -10995,101 +11015,101 @@ xref 0000116342 00000 n 0000122698 00000 n 0000122875 00000 n -0000123921 00000 n -0000124012 00000 n -0000124261 00000 n -0000126285 00000 n -0000135046 00000 n -0000135084 00000 n -0000135122 00000 n -0000135481 00000 n -0000135904 00000 n -0000135958 00000 n -0000136012 00000 n -0000136065 00000 n -0000136119 00000 n -0000136173 00000 n -0000136227 00000 n -0000136280 00000 n -0000136334 00000 n -0000136388 00000 n -0000136441 00000 n -0000136495 00000 n -0000136549 00000 n -0000136603 00000 n -0000136657 00000 n -0000136711 00000 n -0000136765 00000 n -0000136819 00000 n -0000136872 00000 n -0000136926 00000 n -0000136980 00000 n -0000137034 00000 n -0000137088 00000 n -0000137142 00000 n -0000137196 00000 n -0000137250 00000 n -0000137304 00000 n -0000137358 00000 n -0000137412 00000 n -0000137466 00000 n -0000137519 00000 n -0000137573 00000 n -0000137627 00000 n -0000137682 00000 n -0000137736 00000 n -0000137790 00000 n -0000137843 00000 n -0000137897 00000 n -0000137951 00000 n -0000138005 00000 n -0000138059 00000 n -0000138112 00000 n -0000138165 00000 n -0000138219 00000 n -0000138273 00000 n -0000138327 00000 n -0000138381 00000 n -0000138435 00000 n -0000138727 00000 n -0000139855 00000 n -0000140147 00000 n -0000142307 00000 n -0000142617 00000 n -0000144360 00000 n -0000144688 00000 n -0000147522 00000 n -0000147814 00000 n -0000150317 00000 n -0000150627 00000 n -0000152184 00000 n -0000152476 00000 n -0000154742 00000 n -0000155034 00000 n -0000157367 00000 n -0000157641 00000 n -0000158099 00000 n -0000158427 00000 n -0000162472 00000 n -0000162801 00000 n -0000165292 00000 n -0000165552 00000 n -0000165823 00000 n -0000166173 00000 n -0000168033 00000 n -0000168326 00000 n -0000170149 00000 n -0000170442 00000 n -0000172015 00000 n -0000172142 00000 n -0000173229 00000 n +0000123911 00000 n +0000124002 00000 n +0000124251 00000 n +0000126261 00000 n +0000134990 00000 n +0000135028 00000 n +0000135066 00000 n +0000135425 00000 n +0000135848 00000 n +0000135902 00000 n +0000135956 00000 n +0000136009 00000 n +0000136063 00000 n +0000136117 00000 n +0000136171 00000 n +0000136224 00000 n +0000136278 00000 n +0000136332 00000 n +0000136385 00000 n +0000136439 00000 n +0000136493 00000 n +0000136547 00000 n +0000136601 00000 n +0000136655 00000 n +0000136709 00000 n +0000136763 00000 n +0000136816 00000 n +0000136870 00000 n +0000136924 00000 n +0000136978 00000 n +0000137032 00000 n +0000137086 00000 n +0000137140 00000 n +0000137194 00000 n +0000137248 00000 n +0000137302 00000 n +0000137356 00000 n +0000137410 00000 n +0000137463 00000 n +0000137517 00000 n +0000137571 00000 n +0000137626 00000 n +0000137680 00000 n +0000137734 00000 n +0000137787 00000 n +0000137841 00000 n +0000137895 00000 n +0000137949 00000 n +0000138003 00000 n +0000138056 00000 n +0000138109 00000 n +0000138163 00000 n +0000138217 00000 n +0000138271 00000 n +0000138325 00000 n +0000138379 00000 n +0000138671 00000 n +0000139799 00000 n +0000140091 00000 n +0000142251 00000 n +0000142561 00000 n +0000144304 00000 n +0000144632 00000 n +0000147466 00000 n +0000147758 00000 n +0000150261 00000 n +0000150571 00000 n +0000152128 00000 n +0000152420 00000 n +0000154686 00000 n +0000154978 00000 n +0000157311 00000 n +0000157585 00000 n +0000158043 00000 n +0000158371 00000 n +0000162416 00000 n +0000162745 00000 n +0000165236 00000 n +0000165496 00000 n +0000165767 00000 n +0000166117 00000 n +0000167973 00000 n +0000168266 00000 n +0000170089 00000 n +0000170382 00000 n +0000171955 00000 n +0000172082 00000 n +0000173169 00000 n trailer << /Size 967 /Root 966 0 R /Info 964 0 R - /ID [(qOiABtvAuy1vyxpi9itmRQ==) (qOiABtvAuy1vyxpi9itmRQ==)] + /ID [(MVbuUUU0+4V4MHFCXBAo7Q==) (MVbuUUU0+4V4MHFCXBAo7Q==)] >> startxref -173467 +173407 %%EOF \ No newline at end of file diff --git a/e-voting-system/rapport/technical_report.typ b/e-voting-system/rapport/technical_report.typ index 81112ab..c22094c 100644 --- a/e-voting-system/rapport/technical_report.typ +++ b/e-voting-system/rapport/technical_report.typ @@ -573,7 +573,7 @@ Accès : Test ElGamal roundtrip : m = decrypt(encrypt(m)) -Test homomorphe : decrypt(E[m1) times E(m2)) = m1 + m2 +Test homomorphe : decrypt(E(m1) times E(m2)) = m1 + m2 Test Dilithium : Signature valide / invalide rejeté