Skip to content

Latest commit

 

History

History
159 lines (119 loc) · 6.66 KB

File metadata and controls

159 lines (119 loc) · 6.66 KB

کتابخانهٔ رمزنگاری (نسخه با KID و رابط خط فرمان)

کتابخانه و ابزار CLI به زبان C++ برای رمزگذاری/رمزگشایی فایل یا پوشه با استفاده از 7‑Zip برای آرشیو و یک زنجیره از الگوریتم‌ها (به‌صورت پیش‌فرض: ابتدا AES سپس XOR).
هر فایلِ رمز‌شده دارای هدرِ واضح با شناسهٔ کلید (KID) است تا در keys.txt بدون وابستگی به ترتیب خطوط، کلید درست پیدا شود.


سازوکار

  1. زیپ با پسورد (7‑Zip): ورودی (فایل/پوشه) با دستور 7z و پسورد داده‌شده آرشیو می‌شود.
  2. زنجیرهٔ تبدیل‌ها: در رمزگذاری، الگوریتم‌ها به‌ترتیب اجرا می‌شوند (مثلاً AES → XOR). در رمزگشایی، الگوریتم‌ها برعکس اجرا می‌شوند (XOR → AES).
  3. هدر واضح: ابتدای خروجی رمز‌شده شامل موارد زیر است:
    ENCLIBv1
    KID:<هگز ۶۴ کاراکتری SHA-256 از کلید>
    
    <payload باینریِ رمز‌شده...>
    
  4. یافتن کلید با 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

فایل‌های پروژه

  • Encryptor.h — API/ساختارها
  • Encryptor.cpp — منطق encrypt/decrypt، هدر/KID، فراخوانی 7‑Zip، AES/XOR
  • main.cpp — رابط خط فرمان (CLI)

ساخت (Build)

Linux/macOS (g++)

g++ -std=c++17 -O2 -o encrypt_demo main.cpp Encryptor.cpp -lcrypto

Windows (MinGW)

g++ -std=c++17 -O2 -o encrypt_demo.exe main.cpp Encryptor.cpp -lcrypto

در MSVC مطابق نصب سیستم خودتان OpenSSL را لینک کنید.


استفاده (CLI)

راهنما

./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 استفاده کنید.


فایل کلیدها (keys.txt)

  • هر خط = یک کلید (UTF‑8 بدون BOM، بدون فاصلهٔ ابتدا/انتها).
  • KID = SHA‑256(key) (هگز ۶۴ کاراکتری) در هدر ذخیره می‌شود.
  • کتابخانه هنگام لود، کلیدهای تکراری را بر اساس KID حذف می‌کند.

تولید سریع کلیدهای تصادفی (Linux/macOS)

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 استفاده کنید (محرمانگی + صحت).
  • از فایل کلیدها محافظت کنید (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 اضافه کنید.