کتابخانه و ابزار CLI به زبان C++ برای رمزگذاری/رمزگشایی فایل یا پوشه با استفاده از 7‑Zip برای آرشیو و یک زنجیره از الگوریتمها (بهصورت پیشفرض: ابتدا AES سپس XOR).
هر فایلِ رمزشده دارای هدرِ واضح با شناسهٔ کلید (KID) است تا در keys.txt بدون وابستگی به ترتیب خطوط، کلید درست پیدا شود.
- زیپ با پسورد (7‑Zip): ورودی (فایل/پوشه) با دستور
7zو پسورد دادهشده آرشیو میشود. - زنجیرهٔ تبدیلها: در رمزگذاری، الگوریتمها بهترتیب اجرا میشوند (مثلاً AES → XOR). در رمزگشایی، الگوریتمها برعکس اجرا میشوند (XOR → AES).
- هدر واضح: ابتدای خروجی رمزشده شامل موارد زیر است:
ENCLIBv1 KID:<هگز ۶۴ کاراکتری SHA-256 از کلید> <payload باینریِ رمزشده...> - یافتن کلید با KID: دیکودر KID را از هدر میخواند، روی هر خط از
keys.txt(بعد از trim فاصلهها) SHA‑256 میگیرد و کلید متناظر را پیدا میکند، سپس زنجیرهٔ معکوس را اجرا میکند.
سیاست مصرف کلید (مطابق درخواست شما):
بعد از encrypt موفق، کلید استفادهشده ازkeys.txtحذف میشود (یکبارمصرف). اگر روی همان دستگاه بلافاصله decrypt میکنید، از کپی جداگانه فایل کلیدها استفاده کنید یا سیاست را به «حذف در decrypt» تغییر دهید.
- 7‑Zip CLI برای آرشیوِ پسورددار
- زنجیرهٔ تبدیلِ قابل توسعه؛ پیشفرضها:
- AES (OpenSSL EVP، تنظیمات نمایشی)
- XOR (خودمعکوس؛ صرفاً آزمایشی)
- جستوجوی کلید بر پایهٔ KID: بدون وابستگی به جایگاه کلید در
keys.txt - حذف کلیدهای تکراری بر اساس KID هنگام لود
- C++17 (مثل
g++) - OpenSSL برای AES (
-lcrypto) - 7‑Zip: وجود دستور
7zدر PATH- Linux/WSL:
sudo apt install p7zip-full - macOS (Homebrew):
brew install p7zip - Windows: نصب 7‑Zip و افزودن
7z.exeبه PATH
- Linux/WSL:
Encryptor.h— API/ساختارهاEncryptor.cpp— منطق encrypt/decrypt، هدر/KID، فراخوانی 7‑Zip، AES/XORmain.cpp— رابط خط فرمان (CLI)
g++ -std=c++17 -O2 -o encrypt_demo main.cpp Encryptor.cpp -lcryptog++ -std=c++17 -O2 -o encrypt_demo.exe main.cpp Encryptor.cpp -lcryptoدر MSVC مطابق نصب سیستم خودتان OpenSSL را لینک کنید.
./encrypt_demo --help./encrypt_demo -e -i <inputPath> -o <encryptedFile> -k <keys.txt> [-p <zipPassword>]-i: فایل/پوشهٔ ورودی برای زیپ-o: فایل خروجیِ رمزشده (مثلاًencrypted.dat)-k: مسیر فایل کلیدها-p: پسورد آرشیو 7‑Zip (پیشفرض:zipSecret)
./encrypt_demo -d -i <encryptedFile> -o <outputDir> -k <keys.txt> [-p <zipPassword>]-i: فایل رمزشده (خروجی Encrypt)-o: پوشهٔ مقصد برای استخراج
# Encrypt
./encrypt_demo -e -i ./example.txt -o ./encrypted.dat -k ./keys_sender.txt -p zipSecret
# Decrypt
./encrypt_demo -d -i ./encrypted.dat -o ./decrypted_output -k ./keys_receiver.txt -p zipSecretاگر سیاست شما حذف کلید در encrypt است، برای تست رفتوبرگشت روی یک دستگاه، از کپی جداگانهٔ فایل کلید برای decrypt استفاده کنید.
- هر خط = یک کلید (UTF‑8 بدون BOM، بدون فاصلهٔ ابتدا/انتها).
- KID = SHA‑256(key) (هگز ۶۴ کاراکتری) در هدر ذخیره میشود.
- کتابخانه هنگام لود، کلیدهای تکراری را بر اساس KID حذف میکند.
for i in {1..200}; do LC_ALL=C tr -dc 'A-Za-z0-9_-.' </dev/urandom | head -c 64; echo; done > keys_raw.txt
python3 - <<'PY'
import hashlib
seen=set(); out=[]
for k in open("keys_raw.txt","r",encoding="utf-8",errors="ignore"):
k=k.strip()
if not k: continue
kid=hashlib.sha256(k.encode()).hexdigest()
if kid in seen: continue
seen.add(kid); out.append(k)
open("keys.txt","w").write("\n".join(out)+"\n")
print("written",len(out),"keys to keys.txt")
PY- XOR صرفاً آزمایشی است؛ برای محرمانگی واقعی روی آن حساب نکنید.
- AES نمونه از AES‑256‑CBC با IV صفر استفاده میکند (برای سادگی). در کاربرد جدی:
- برای هر فایل یک IV تصادفی بسازید و در هدر ذخیره کنید (مثلاً
IV:<hex>). - بهتر است از AES‑GCM استفاده کنید (محرمانگی + صحت).
- برای هر فایل یک IV تصادفی بسازید و در هدر ذخیره کنید (مثلاً
- از فایل کلیدها محافظت کنید (
chmod 600 keys.txt، بکاپ رمزشده و ...).
No matching key for KID=...- کلید متناظر وجود ندارد (شاید در encrypt مصرف و حذف شده).
- فایل کلید BOM یا فاصلههای اضافی دارد و KID تغییر کرده—به UTF‑8 بدون BOM ذخیره کنید.
- برای تست، از کپی جداگانهٔ keys در decrypt استفاده کنید.
7zip extract failed- پسورد
-pنادرست است. - ترتیب زنجیره در decrypt باید برعکس encrypt باشد (در کد رعایت شده).
7zدر PATH نیست یا آرشیو خراب است.
- پسورد
7z: command not found- Linux:
sudo apt install p7zip-full - macOS:
brew install p7zip - Windows: 7‑Zip را نصب و به PATH اضافه کنید.
- Linux: