
एक गीगाबाइट-प्रति-सेकंड, मल्टी-थ्रेडेड फ़ाइल एन्क्रिप्शन इंजन। लॉक-फ्री, ट्रिपल-बफ़र्ड io_uring पाइपलाइन, रेयॉन समानांतर चंकिंग, और हार्डवेयर-त्वरित AEADs (AES-256-GCM / ChaCha20) का उपयोग करके अत्यधिक थ्रूपुट प्राप्त करता है।
Rust में निर्मित एक मल्टी-थ्रेडेड AEAD एन्क्रिप्शन इंजन। ट्रिपल-बफर्ड io_uring पाइपलाइन, Rayon के माध्यम से समानांतर चंक प्रोसेसिंग, और ring के माध्यम से असेंबली-ऑप्टिमाइज्ड सिफर का उपयोग करके गीगाबाइट-प्रति-सेकंड थ्रूपुट पर फ़ाइलों को एन्क्रिप्ट और डिक्रिप्ट करता है।
⚠️ अस्वीकरण: प्रयोगात्मक सॉफ्टवेयर ⚠️
यह प्रोजेक्ट अत्यंत नया है और वर्तमान में उत्पादन या मिशन-महत्वपूर्ण उपयोग के लिए अनुशंसित नहीं है। हालांकि क्रिप्टोग्राफिक प्राइमिटिव (AES-256-GCM, ChaCha20-Poly1305 via ring) और प्रारूप डिज़ाइन सुदृढ़ हैं, कोडबेस का औपचारिक सुरक्षा ऑडिट या व्यापक वास्तविक दुनिया परीक्षण नहीं हुआ है। अपने जोखिम पर उपयोग करें। संवेदनशील डेटा की सुरक्षा के लिए, इस प्रोजेक्ट के परिपक्व होने तक GnuPG, age, या OpenSSL जैसे युद्ध-परीक्षित टूल का उपयोग करने पर विचार करें।
ring (असेंबली-ऑप्टिमाइज्ड)--memory के माध्यम से कॉन्फ़िगरेबल)ring के माध्यम से seal_in_place_separate_tag / open_in_place हॉट लूप में आवंटन को कम करता हैO_DIRECT I/O को सक्षम करते हैं, NVMe पर DMA-स्पीड रीड/राइट के लिए कर्नेल पेज कैश को बायपास करते हैं। बफर पूल 4096-बाइट संरेखण के साथ std::alloc का उपयोग करते हैंcargo bench (Criterion, 10 नमूने प्रति माप) के साथ बेंचमार्क किया गया। कुंजी व्युत्पत्ति शामिल नहीं है - संख्याएँ केवल शुद्ध क्रिप्टो थ्रूपुट दर्शाती हैं।
हार्डवेयर:
I/O पर नोट: Criterion अस्थायी फ़ाइलें /tmp में लिखता है, जो इस सिस्टम पर tmpfs (RAM-समर्थित) है। O_DIRECT के साथ, कर्नेल tmpfs पर वास्तविक अतुल्यकालिक DMA का उपयोग नहीं कर सकता, इसलिए ये संख्याएँ सिफर थ्रूपुट + io_uring ओवरहेड को DMA बायपास लाभ के बिना दर्शाती हैं। एक वास्तविक Gen4 NVMe ड्राइव पर, O_DIRECT पेज-कैश डबल-बफ़रिंग को समाप्त करता है और DMA को सीधे संरेखित बफर पूल में सक्षम करता है, जिससे काफी अधिक थ्रूपुट मिलना चाहिए।
चंक आकार स्वीप (AES-256-GCM, 64 MiB फ़ाइल):
यह इंजन सिफर संचालन के लिए ring (असेंबली-ऑप्टिमाइज्ड AES-NI / NEON / ARMv8-CE) और I/O के लिए ट्रिपल-बफर्ड io_uring पाइपलाइन का उपयोग करता है। तीन पूर्व-आवंटित बफर पूल पाइपलाइन के माध्यम से घूमते हैं: जबकि पूल A के राइट्स कर्नेल में पूरे हो रहे हैं, पूल B को Rayon द्वारा CPU पर एन्क्रिप्ट किया जा रहा है, और पूल C के रीड्स कर्नेल को सबमिट किए जा रहे हैं। यह I/O विलंबता को क्रिप्टो गणना के साथ ओवरलैप करता है।
क्यों AES-256-GCM छोटी फ़ाइलों पर ChaCha20-Poly1305 से तेज़ है:
ring का AES-GCM बैकएंड x86-64 पर उपलब्ध AES-NI + CLMUL हार्डवेयर निर्देशों का शोषण करता है, जो इसे ChaCha20 (जो एक सॉफ्टवेयर सिफर है) पर हार्डवेयर लाभ देता है। बड़े आकारों पर दोनों सिफर ~1.0 GiB/s पर अभिसरित होते हैं, जो दर्शाता है कि बाधा सिफर थ्रूपुट से I/O सबमिशन ओवरहेड में स्थानांतरित हो जाती है।
क्यों पीक थ्रूपुट 1-16 MiB पर है, 256 MiB पर नहीं: छोटी फ़ाइलों (1-16 MiB) में कुछ चंक होते हैं, इसलिए Rayon समानांतरता कुशल है और कार्यशील सेट कैश में फिट होता है। 64-256 MiB पर, io_uring पाइपलाइन पूरी तरह से सक्रिय है (तीन बैच इन-फ़्लाइट), लेकिन प्रति-SQE सबमिशन और CQE पूर्णता ओवरहेड चंक गणना के साथ स्केल होता है। ट्रिपल-बफर डिज़ाइन सुनिश्चित करता है कि I/O और क्रिप्टो ओवरलैप हों, इस लागत को आंशिक रूप से छिपाते हुए।
क्यों ~1.0 GiB/s, न कि 10+ GiB/s: आधुनिक AES-NI प्रति कोर 2-4 GiB/s धक्का दे सकता है। 12 थ्रेड्स के साथ, कच्चा सिफर थ्रूपुट 10 GiB/s से अधिक हो सकता है। तीन कारक अंतर की व्याख्या करते हैं:
PIPELINE_DEPTH=3 के साथ, किसी भी समय केवल तीन बैच पाइपलाइन के माध्यम से घूमते हैं। स्थिर-अवस्था ओवरलैप के लिए कम से कम तीन बैचों की आवश्यकता होती है; जो फ़ाइलें एक या दो बैचों में फिट होती हैं, उन्हें पाइपलाइनिंग से लाभ नहीं होता है।बफर जीवनचक्र और सुरक्षा:
बफर पूल को io_uring रिंग बनाने से पहले std::alloc::alloc_zeroed के साथ Layout::from_size_align(size, 4096) का उपयोग करके एक बार आवंटित किया जाता है, और पुनः आवंटन के बिना सभी पाइपलाइन पुनरावृत्तियों में पुन: उपयोग किया जाता है। प्रत्येक एन्क्रिप्टेड चंक को O_DIRECT राइट से पहले सेक्टर संरेखण के लिए शून्य-पैड किया जाता है। बफर पूल से पहले रिंग को स्पष्ट रूप से हटा दिया जाता है, यह सुनिश्चित करते हुए कि कर्नेल कभी मुक्त मेमोरी का संदर्भ न दे (कोई UAF नहीं)।
git clone https://github.com/frogsnot/concryptor.git
cd concryptor
cargo build --release
बाइनरी target/release/concryptor पर होगी।
# AES-256-GCM (डिफ़ॉल्ट), आउटपुट myfile.dat.enc
concryptor encrypt myfile.dat
# ChaCha20-Poly1305, कस्टम आउटपुट पथ
concryptor encrypt myfile.dat --cipher chacha -o encrypted.enc
# कस्टम चंक आकार (MiB में)
concryptor encrypt largefile.iso --chunk-size 8
# मजबूत KDF (512 MiB मेमोरी लागत)
concryptor encrypt secrets.tar --memory 512
# गैर-इंटरैक्टिव (पासवर्ड प्रॉम्प्ट छोड़ें)
concryptor encrypt myfile.dat -p "password"
सुरक्षा नोट:
--password/-pपासवर्ड को CLI आर्गुमेंट के रूप में पास करता है, जोpsआउटपुट और शेल हिस्ट्री में दिखाई देता है। इंटरैक्टिव उपयोग के लिए, इसे छोड़ दें ताकि सुरक्षित छिपा हुआ प्रॉम्प्ट मिले। स्क्रिप्टिंग के लिए, बाद में हिस्ट्री साफ़ करना या किसी रैपर का उपयोग करना पसंद करें जो फ़ाइल डिस्क्रिप्टर से पढ़ता हो।
# निर्देशिका एन्क्रिप्ट करें (स्वतः पहचानता है, mydir.tar.enc उत्पन्न करता है)
concryptor encrypt mydir/
# कस्टम सिफर और आउटपुट के साथ
concryptor encrypt mydir/ --cipher chacha -o secrets.enc
निर्देशिका एन्क्रिप्शन एक अस्थायी tar आर्काइव (.concryptor-*.tar, 0600 अनुमतियाँ, CSPRNG-नामित) बनाता है, इसे एन्क्रिप्ट करता है, फिर अस्थायी फ़ाइल को स्वतः हटा देता है। फ़ाइल नाम, निर्देशिका संरचना, अनुमतियाँ और टाइमस्टैम्प सभी एन्क्रिप्टेड पेलोड के अंदर होते हैं।
# स्वतः .enc एक्सटेंशन हटाता है
concryptor decrypt myfile.dat.enc
# कस्टम आउटपुट पथ
concryptor decrypt encrypted.enc -o restored.dat
# गैर-इंटरैक्टिव
concryptor decrypt myfile.dat.enc -p "password"
# एक चरण में डिक्रिप्ट और निकालें (स्वतः .tar.enc हटाता है -> निर्देशिका नाम)
concryptor decrypt mydir.tar.enc --extract
# छोटा फ़्लैग, कस्टम आउटपुट निर्देशिका
concryptor decrypt mydir.tar.enc -x -o restored_dir/
--extract के बिना, निर्देशिका आर्काइव को डिक्रिप्ट करने से मध्यवर्ती .tar फ़ाइल उत्पन्न होती है, जिसे आप निरीक्षण या मैन्युअल रूप से निकाल सकते हैं।
concryptor --help
concryptor encrypt --help
concryptor decrypt --help
सभी मान लिटिल-एंडियन हैं। हैडर एक पूर्ण 4 KiB सेक्टर पर कब्जा करता है; प्रत्येक एन्क्रिप्टेड चंक स्लॉट अगली 4 KiB सीमा तक पैड किया जाता है। यह सुनिश्चित करता है कि O_DIRECT के लिए प्रत्येक ऑफ़सेट और I/O आकार सेक्टर-संरेखित हो।
ऑफ़सेट आकार फ़ील्ड
------ ----- ---------------------
0 10 मैजिक बाइट्स "CONCRYPTOR"
10 1 प्रारूप संस्करण (4)
11 1 सिफर प्रकार (0 = AES-256-GCM, 1 = ChaCha20-Poly1305)
12 4 चंक आकार (बाइट्स, LE)
16 8 मूल फ़ाइल आकार (बाइट्स, LE)
24 16 Argon2 सॉल्ट (क्रिप्टोग्राफिक रूप से यादृच्छिक, प्रति फ़ाइल अद्वितीय)
40 12 बेस नॉन्स (क्रिप्टोग्राफिक रूप से यादृच्छिक, प्रति फ़ाइल अद्वितीय)
52 4 Argon2 m_cost KiB में (LE, 0 = लीगेसी 64 MiB)
56 4 Argon2 t_cost / पुनरावृत्तियाँ (LE, 0 = लीगेसी 3)
60 4 Argon2 p_cost / समानता (LE, 0 = लीगेसी 4)
64 4032 आरक्षित (शून्य-पैड 4096 बाइट्स तक)
4096 ... [चंक 0: सिफरटेक्स्ट + 16-बाइट टैग + सेक्टर सीमा तक शून्य पैडिंग]
[चंक 1: सिफरटेक्स्ट + 16-बाइट टैग + सेक्टर सीमा तक शून्य पैडिंग]
...
4 MiB चंकों के लिए: प्रत्येक डिस्क स्लॉट ceil((4194304 + 16) / 4096) * 4096 = 4198400 बाइट्स (प्रति चंक 4080 बाइट्स पैडिंग) है। हैडर में 4032 आरक्षित बाइट्स भविष्य की सुविधाओं (असममित कुंजी स्लॉट, मेटाडेटा, आदि) के लिए उपलब्ध हैं।
सॉल्ट और बेस नॉन्स प्रत्येक एन्क्रिप्शन पर rand::rng() (OS CSPRNG द्वारा समर्थित) से ताज़ा उत्पन्न होते हैं। फ़ाइलों में पासवर्ड का पुन: उपयोग सुरक्षित है क्योंकि अलग-अलग सॉल्ट अलग-अलग Argon2id कुंजियाँ उत्पन्न करते हैं, और अलग-अलग बेस नॉन्स अलग-अलग प्रति-चंक नॉन्स उत्पन्न करते हैं।
chunk_nonce = base_nonce XOR chunk_index (TLS 1.3 शैली)। चंकों को स्वैप करने से डिक्रिप्शन विफलता होती है क्योंकि स्थिति N पर नॉन्स मूल रूप से स्थिति M पर चंक को एन्क्रिप्ट करने के लिए उपयोग किए गए नॉन्स से मेल नहीं खाएगा। नोट: XOR-आधारित नॉन्स व्युत्पत्ति में एक सैद्धांतिक कमजोरी है जब एक ही कुंजी का उपयोग कई स्ट्रीमों में किया जाता है (अलग-अलग बेस नॉन्स ओवरलैपिंग नॉन्स स्पेस उत्पन्न कर सकते हैं)। यह Concryptor पर लागू नहीं होता क्योंकि प्रत्येक एन्क्रिप्शन एक ताज़ा 128-बिट यादृच्छिक सॉल्ट उत्पन्न करता है, जो प्रति फ़ाइल एक अद्वितीय Argon2id कुंजी उत्पन्न करता है। नॉन्स अद्वितीयता केवल एक ही कुंजी के तहत मायने रखती है, और कुंजी पुन: उपयोग संभावना ~2^-128 प्रति फ़ाइल युग्म है।AAD = full_aligned_header (4096) || chunk_index (8 LE) || is_final (1) (कुल 4105 बाइट्स) का उपयोग करता है। संपूर्ण 4 KiB हैडर सेक्टर (कोर फ़ील्ड्स, KDF पैरामीटर और आरक्षित पैडिंग) प्रत्येक चंक के प्रमाणीकरण टैग में बाध्य होता है। किसी भी हैडर बाइट (सिफर प्रकार, चंक आकार, मूल आकार, सॉल्ट, नॉन्स, KDF पैरामीटर या आरक्षित पैडिंग) को संशोधित करने से सभी चंक अमान्य हो जाते हैं। यह ट्रंकेशन हमलों को रोकता है जहाँ एक विरोधी original_size को संपादित करता है और अनुगामी चंकों को हटाता है, और आरक्षित पैडिंग क्षेत्र में डेटा की तस्करी को भी रोकता है। लीगेसी v3 फ़ाइलों को पिछड़ी संगतता के लिए 52-बाइट AAD के साथ डिक्रिप्ट किया जाता है; v4 से v3 में कोई डाउनग्रेड संभव नहीं है क्योंकि संस्करण बाइट स्वयं प्रमाणित AAD के अंदर है।0x01 और अन्य सभी के लिए 0x00 है। यह दो हमलों को रोकता है:
is_final = 0x00 के साथ एन्क्रिप्ट किया गया था लेकिन डिक्रिप्शन की अपेक्षा करता है।# पूर्ण परीक्षण सूट चलाएँ (67 परीक्षण)
cargo test
# बेंचमार्क चलाएँ (target/criterion/ में HTML रिपोर्ट)
cargo bench
# बेंचमार्क फ़िल्टर करें
cargo bench -- "encrypt/AES"
cargo bench -- "chunk_sweep"
परीक्षण सूट शामिल करता है:
original_size + हटाए गए चंक)chunk_size)# crates.io से (अनुशंसित)
cargo install concryptor
# स्रोत से
git clone https://github.com/FrogSnot/Concryptor
cd Concryptor
cargo build --release
# बाइनरी target/release/concryptor पर है
यह प्रोजेक्ट GNU Affero General Public License v3.0 के अंतर्गत लाइसेंस प्राप्त है।
| फ़ाइल आकार | AES-256-GCM एन्क्रिप्ट | ChaCha20 एन्क्रिप्ट | AES-256-GCM डिक्रिप्ट | ChaCha20 डिक्रिप्ट |
|---|
| 64 KiB | 244 MiB/s | 233 MiB/s | 233 MiB/s | 234 MiB/s |
| 1 MiB | 1.08 GiB/s | 882 MiB/s | 1010 MiB/s | 876 MiB/s |
| 16 MiB | 1.10 GiB/s | 923 MiB/s | 1.06 GiB/s | 988 MiB/s |
| 64 MiB | 984 MiB/s | 935 MiB/s | 988 MiB/s | 973 MiB/s |
| 256 MiB | 1.00 GiB/s | 1015 MiB/s | 1.01 GiB/s | 1.02 GiB/s |
| चंक आकार | थ्रूपुट |
|---|
| 64 KiB | 1.01 GiB/s |
| 256 KiB | 1.05 GiB/s |
| 1 MiB | 1.07 GiB/s |
| 4 MiB | 988 MiB/s |
| 8 MiB | 988 MiB/s |
| 16 MiB | 1.00 GiB/s |
0x01is_final = 0x01 के लिए एक मान्य टैग उत्पन्न नहीं कर सकता।rand::rng()) से 16-बाइट सॉल्ट और 12-बाइट बेस नॉन्स लिया जाता है। एक ही पासवर्ड के साथ एक ही फ़ाइल के दो एन्क्रिप्शन पूरी तरह से अलग सिफरटेक्स्ट उत्पन्न करते हैं। नॉन्स पुन: उपयोग (जो AES-GCM के लिए विनाशकारी है) निर्माण द्वारा टाला जाता है।--memory के माध्यम से समायोज्य), 3 समय पुनरावृत्तियाँ, समानता 4 के साथ। 256 MiB डिफ़ॉल्ट OWASP न्यूनतम से 4 गुना है और GPU/FPGA/ASIC हमलावरों के लिए महंगा है। KDF पैरामीटर फ़ाइल हैडर (बाइट्स 52-63) में संग्रहीत होते हैं, जिससे फ़ाइलें स्व-वर्णन होती हैं — डिक्रिप्शन हमेशा वर्तमान डिफ़ॉल्ट की परवाह किए बिना सही पैरामीटर का उपयोग करता है। यदि बाइट्स 52-63 सभी शून्य हैं (पूर्व-KDF-पैराम्स फ़ाइलों के लिए लीगेसी), तो पुराने 64 MiB / 3 / 4 डिफ़ॉल्ट लागू किए जाते हैं।| Crâte | उद्देश्य |
|---|
ring | असेंबली-ऑप्टिमाइज्ड AES-256-GCM और ChaCha20-Poly1305 AEAD |
io-uring | Linux io_uring इंटरफ़ेस अतुल्यकालिक रीड/राइट I/O के लिए |
libc | O_DIRECT फ़्लैग और हैडर I/O के लिए संरेखित pread/pwrite |
argon2 | Argon2id कुंजी व्युत्पत्ति |
rayon | डेटा-समानांतर चंक प्रोसेसिंग |
clap | CLI आर्गुमेंट पार्सिंग |
indicatif | टर्मिनल प्रगति पट्टी |
rand | क्रिप्टोग्राफिक यादृच्छिक संख्या उत्पादन |
zeroize | सुरक्षित मेमोरी वाइपिंग |
anyhow | त्रुटि प्रबंधन |
rpassword | छिपा हुआ पासवर्ड इनपुट |
tar | निर्देशिका आर्काइविंग और निष्कर्षण |