
Artefacts de cryptanalyse reproductibles pour les attaques de récupération de clé unique sur AES à tours réduits, incluant la récupération de clé en boîte noire, la recherche DDT-Gray, les caches de S-box et les preuves formelles Lean.
Code source de chaque expérience citée dans l'article. Aucune sortie de mesure ni table préconstruite n'est fournie : chaque programme imprime ou écrit ses propres résultats, de sorte que chaque chiffre peut être régénéré à partir de zéro.
| répertoire | description |
|---|---|
experiments/ | les deux expériences derrière l'annexe Measured costs : la récupération complète de clé en boîte noire sur SR(7,2,2,6), et les mesures par entrée / par candidat de l'attaque réelle sur AES-128 à 7 tours |
c/ | programmes C autonomes, un par affirmation sur un composant (bridge, empreintes, parcours DDT-Gray, caches de S-box, randomisation de mauvaise clé, plancher de lookup) |
python/ | vérifications Python d'affirmations isolées et implémentation de référence pédagogique des couches de l'attaque (python/a1/) |
rust/ | une seconde implémentation indépendante des expériences sur les composants (e1–e13) |
figures/ | scripts de tracé qui consomment les TSV écrits par les programmes C |
lean/ | formalisation Lean 4 + Mathlib de la borne de comptage des faux positifs de χ★ (lean/chi-fp/, article §5.5) |
Les affirmations de récupération de clé de l'article reposent sur experiments/ ; c/, python/ et rust/ vérifient les composants individuels (identités, invariances, faits sur les DDT, correction des caches, statistiques de randomisation) et ne sont pas des attaques.
experiments/Voir experiments/README.md.
sr7226-e2e/ — récupération complète de clé en boîte noire sur AES SR(7,2,2,6)
(état 2x2, mots de 6 bits, clé de 24 bits) avec la table hors ligne complète, pour
trois variantes sur une même base de code : la nôtre, Derbez–Fouque–Jean avec nos
optimisations d'énumération de table, et Derbez–Fouque–Jean telle que publiée.aes128-measured/ — l'attaque réelle sur AES-128 à 7 tours, unité par unité :
entrées authentiques de la table hors ligne (table partielle), cycles par candidat
en ligne pour les trois variantes, les dénominateurs AES, les taux de faux positifs
et de couverture de l'empreinte ordonnée, et la projection vers le décompte complet.c/Fichier unique ou autonome par répertoire ; compiler avec
gcc -O3 -march=native -fopenmp -o <bin> <file.c> -lm (ajouter le répertoire
en -I lorsqu'un en-tête local est utilisé). L'utilisation est documentée dans le commentaire
d'en-tête de chaque fichier.
| chemin | vérifie | emplacement dans l'article |
|---|---|---|
clump.c, chi_clump.c | entropie de collision des empreintes I_{m,n} et χ★ | propriétés des empreintes ; ann. entropie de collision |
wrongkey.c | randomisation de mauvaise clé, balayage exhaustif de 2^32 sur k_6 | ann. randomisation de mauvaise clé |
fp_solve.c | résolution DDT et énumération des bits de branche utilisées par la construction de la table | §DDT-Gray |
bridge-consistency/bc_impl_{a,b}.c, bc_truehit.c | deux implémentations indépendantes de la statistique de faux accept de bridge-consistency | Alg. BridgeConsistency |
ddt-gray/ddt_gray_*.c | parcours de Gray tenant compte des DDT : l'incrémental égale le recalcul à froid, coût amorti des S-box, chronométrage | §DDT-Gray, ann. DDT-Gray |
sb-cache/sbc_repro.c | séparabilité XOR derrière les caches de S-box W / UU ; forme close de c_iSB | §S-box caches |
mobius-honest/honest_online.c | le côté en ligne avec |K_on| = 8 : le δ-ensemble reconstruit à partir de k_{-1} uniquement, et le taux de survivants de mauvaise clé | §component lemmas |
mobius-honest/honest_rebound.c, degen_analysis.c, saes_imn.c | vérifications de pipeline du rebond hors ligne et de l'appariement I_{m,n} sur AES à petite échelle ; les raccourcis à clé connue sont documentés dans chaque en-tête — ce sont des vérifications de pipeline, pas des récupérations de clé | §component lemmas, ann. cas dégénérés |
floor/verify_ls_fp.c, floor/verify_incompat.c, floor/a1_floor.py | le plancher de lookup pour |K_on| = 8 : dim LS(fp) ∈ {0,8} et T ≥ 2^88.67 | ann. borne inférieure |
python/Python 3. python/a1/ n'utilise que la bibliothèque standard ; les scripts de test de premier niveau, figures/ et experiments/aes128-measured/phi/ nécessitent numpy, scipy et matplotlib (pip install -r requirements.txt, versions exactes vérifiées). python/a1/README.md décrit l'implémentation de référence en couches (gf256.py, aes7r.py, chi_canon.py, prop2.py, les vecteurs de référence dans test_vectors.py). Les scripts de premier niveau sont des vérifications d'une seule affirmation : invariants du pont (test_invariants.py, verify_Imn.py), le pont sur de vraies traces AES (test_bridge_aes.py), le comportement limite de 0^{-1} (test_zeroinv.py), la randomisation par mauvaise clé (test_wrongkey.py), l'entropie de regroupement / de collision (test_clumping*.py), l'inversion du calendrier de clés derrière CompleteKey (keysched_solve.py), et la démonstration de faux positifs sur préfixe d'empreinte (fp_concat_demo.py).
rust/cargo build --release, puis ./target/release/repro <exp> [args] ; chaque exécution ajoute un bloc horodaté sous rust/results/. La liste des expériences et ce que chacune vérifie se trouve dans rust/src/main.rs : e1–e13 couvrent l'identité du pont, les faits sur les groupes et les classes latérales, le pont honnête sur de vraies traces AES-128, la randomisation par mauvaise clé, l'entropie de collision, l'invariance χ★, le spectre DDT, la cohérence AES, la mesure du temps par entrée, et le pipeline SR(7,4,4,4).