
Un moteur de chiffrement de fichiers multi-threadé capable de traiter des gigaoctets par seconde. Il atteint un débit extrême grâce à un pipeline io_uring sans verrou et à triple tampon, un découpage parallèle via Rayon, et des AEAD accélérés matériellement (AES-256-GCM / ChaCha20).
Un moteur de chiffrement AEAD multi-threadé construit en Rust. Chiffre et déchiffre des fichiers à un débit de gigaoctets par seconde grâce à un pipeline io_uring triple-bufferisé, un traitement par blocs parallèle via Rayon, et des ciphers optimisés en assembleur via ring.
⚠️ AVERTISSEMENT : LOGICIEL EXPÉRIMENTAL ⚠️
Ce projet est extrêmement récent et n'est actuellement PAS recommandé pour une utilisation en production ou pour des données critiques. Bien que les primitives cryptographiques (AES-256-GCM, ChaCha20-Poly1305 via ring) et la conception du format soient solides, la base de code n'a pas fait l'objet d'audits de sécurité formels ni de tests approfondis en conditions réelles. Utilisez-le à vos risques et périls. Pour protéger des données sensibles, privilégiez des outils éprouvés comme GnuPG, age ou OpenSSL jusqu'à ce que ce projet mûrisse.
ring (optimisé en assembleur)--memory)seal_in_place_separate_tag / open_in_place via ring minimise les allocations dans la boucle chaudeO_DIRECT, contournant le cache de page du noyau pour des lectures/écritures à vitesse DMA sur NVMe. Les pools de tampons utilisent std::alloc avec un alignement de 4096 octetsBenchmarké avec cargo bench (Criterion, 10 échantillons par mesure). La dérivation de clé est exclue — les chiffres reflètent uniquement le débit cryptographique pur.
Matériel :
Note sur les E/S : Criterion écrit des fichiers temporaires dans /tmp, qui sur ce système est tmpfs (backé par la RAM). Avec O_DIRECT, le noyau ne peut pas utiliser le véritable DMA asynchrone sur tmpfs, donc ces chiffres reflètent le débit du cipher + la surcharge de io_uring sans l'avantage du contournement DMA. Sur un véritable disque NVMe Gen4, O_DIRECT élimine la double mise en cache du cache de page et permet le DMA directement dans les pools de tampons alignés, ce qui devrait donner un débit nettement plus élevé.
| Taille du fichier | Chiffrement AES-256-GCM | Chiffrement ChaCha20 | Déchiffrement AES-256-GCM | Déchiffrement ChaCha20 |
|---|---|---|---|---|
| 64 Kio | 244 Mio/s | 233 Mio/s | 233 Mio/s | 234 Mio/s |
| 1 Mio | 1,08 Gio/s | 882 Mio/s | 1010 Mio/s | 876 Mio/s |
| 16 Mio | 1,10 Gio/s | 923 Mio/s | 1,06 Gio/s | 988 Mio/s |
| 64 Mio | 984 Mio/s | 935 Mio/s | 988 Mio/s | 973 Mio/s |
| 256 Mio | 1,00 Gio/s | 1015 Mio/s | 1,01 Gio/s | 1,02 Gio/s |
Balayage de la taille de bloc (AES-256-GCM, fichier de 64 Mio) :
| Taille de bloc | Débit |
|---|---|
| 64 Kio | 1,01 Gio/s |
| 256 Kio | 1,05 Gio/s |
| 1 Mio | 1,07 Gio/s |
| 4 Mio | 988 Mio/s |
| 8 Mio | 988 Mio/s |
| 16 Mio | 1,00 Gio/s |
Le moteur utilise ring (AES-NI / NEON / ARMv8-CE optimisé en assembleur) pour les opérations de cipher et un pipeline io_uring triple-bufferisé pour les E/S. Trois pools de tampons pré-alloués tournent dans le pipeline : pendant que les écritures du pool A se terminent dans le noyau, le pool B est chiffré par Rayon sur le CPU, et les lectures du pool C sont soumises au noyau. Cela superpose la latence des E/S avec le calcul cryptographique.
Pourquoi AES-256-GCM est plus rapide que ChaCha20-Poly1305 sur les petits fichiers :
Le backend AES-GCM de ring exploite les instructions matérielles AES-NI + CLMUL disponibles sur x86-64, ce qui lui donne un avantage matériel par rapport à ChaCha20 (qui est un cipher logiciel). Pour les grandes tailles, les deux ciphers convergent vers ~1,0 Gio/s, indiquant que le goulot d'étranglement passe du débit du cipher à la surcharge de soumission des E/S.
Pourquoi le débit de pointe est à 1-16 Mio, pas à 256 Mio : Les petits fichiers (1-16 Mio) ont peu de blocs, donc le parallélisme Rayon est efficace et l'ensemble de travail tient dans le cache. À 64-256 Mio, le pipeline io_uring est pleinement actif (trois lots en vol), mais la surcharge de soumission SQE et de récupération CQE augmente avec le nombre de blocs. La conception triple-buffer garantit le chevauchement des E/S et de la cryptographie, masquant partiellement ce coût.
Pourquoi ~1,0 Gio/s et pas 10+ Gio/s : L'AES-NI moderne peut pousser 2-4 Gio/s par cœur. Avec 12 threads, le débit brut du cipher pourrait dépasser 10 Gio/s. Trois facteurs expliquent l'écart :