
تضمين رسائل سرية متعددة في اختيارات token في محادثات LLM باستخدام مُرمِّزات إخفاء المعلومات الحسابية/Discop، مع فك ترميز مطابق للبت وتقييم تحليل إخفاء المعلومات.
كود بحثي لـ التشفير اللغوي الخفي عبر محادثات LLM، مع خط أساس أحادي التدفق وبروتوكول متعدد التدفقات (HiTMS) مُجمّع يخفي عدة رسائل سرية مستقلة في وقت واحد ويستغل تجميع GPU لتحقيق إنتاجية أعلى بكثير.
نموذج Bob يطرح الأسئلة؛ ونموذج Alice يجيب، مُشفّرًا الحمولة سرًا في اختياراته للرموز عبر مُشفّر خفي؛ يعيد Bob تشغيل النموذج على رد Alice لاستعادة البتات. التشفير وفك التشفير متطابقان بتًا-بتًا، لذا يُستعاد السر دون أي فقدان.
arithmetic*.py)discop*.py)single_stream.py): لا يوجد حمل إضافي للتأطير — كل بت في القناة هو حمولة (~100% استغلال).protocol.py): m تدفقًا سريًا مُجزّأً عبر الجولات، وتعيين تدفق→فتحة مدفوع بـ PRF، وفتحات خداعية، وترويسات طول 16-بت، وتدفق مفاتيح حشو. يتم توليد عدة استجابات لكل جولة في تمريرة أمامية مُجمّعة واحدة، لذا تتوسع الإنتاجية مع حجم الدفعة.النماذج المستخدمة في التجارب: meta-llama/Llama-3.2-3B-Instruct و google/gemma-3-4b-it. مجموعات البيانات: مجموعات فرعية إبداعية/مفتوحة النهاية من databricks/databricks-dolly-15k و HuggingFaceH4/no_robots.
data/ يحتوي على نتائج كل تجربة في الورقة — السعة، الإنتاجية، الاستغلال، درجات الحَكَم، وAUROC للكاشف — ككائن JSON واحد لكل محاولة. انظر data/README.md للمخطط الكامل.
النص الخفي المُولَّد نفسه غير مضَمّن: السجلات الخام تضمّن السؤال والاستجابة لكل جزء، مما يجعلها نحو 1 جيجابايت، لذا export_data.py يزيل تلك الحقول ويحتفظ بكل القياسات (~24 ميجابايت). جميع المشغِّلات مُبذَّرة (بذور ثابتة)، لذا إعادة تشغيل مسح تُعيد توليد النص تمامًا.
مجلدات المخرجات الخام (
sweep_logs/,single_sweep_logs/,scaling_logs/,judge_logs/,cover_logs/,run_logs/,steganalysis_logs/) مستثناة من git — فهي كبيرة (الآخر يحتوي نقاط تفتيش كاشف مُدرَّبة بحجم متعدد الجيجابايت) وقابلة لإعادة التوليد بالكامل.
conda create -n ems python=3.10 -y && conda activate ems
pip install torch transformers datasets numpy
pip install openai # needed only for judge_quality.py
يلزم GPU من نوع CUDA لتشغيل نماذج LLM. نقاط تفتيش Llama وGemma مقيدة على Hugging Face Hub، لذا شغّل huggingface-cli login (مع منح الوصول لتلك النماذج) قبل أول استخدام.
ابنِ مجمّعات الأسئلة (مرة واحدة):
python build_question_pool.py # -> dolly15k_creative_questions.json
python build_norobots_pool.py # -> norobots_creative_questions.json
محاولة واحدة مفصّلة (فحص سلامة):
# multi-stream
CUDA_VISIBLE_DEVICES=0 python multi_round_demo.py
# single-stream
CUDA_VISIBLE_DEVICES=0 python single_stream_demo.py
# override model / coder / pool via env
ROUND_TRIP_MODEL=google/gemma-3-4b-it STEGO_ALGORITHM=discop \
STEGO_QUESTION_POOL=norobots_creative_questions.json \
CUDA_VISIBLE_DEVICES=0 python multi_round_demo.py
التجارب الكاملة (قابلة للاستئناف — أعد تشغيل نفس الأمر للمتابعة):
# multi-stream (8 streams x 1024 bits), all model/pool/coder combos, 500 trials
CUDA_VISIBLE_DEVICES=0 python run_sweep.py --trials 500
# single-stream baseline
CUDA_VISIBLE_DEVICES=0 python run_single_sweep.py --trials 500
# stream-count scaling (dolly + Llama + Discop)
CUDA_VISIBLE_DEVICES=0 python run_scaling_sweep.py --x-values 4 8 16 32 64
تقييم عدم الإدراك (يتطلب مفتاح OpenAI في OPENAI_API_KEY أو ملف OPENAI_API_key.txt محلي، وكلاهما مستثنى من git):
python judge_quality.py --dry-run # plan only, no API calls
python judge_quality.py --limit 2 # tiny live smoke test
python judge_quality.py # full run (resumable)
python judge_quality.py --aggregate-only # recompute the score table
كل مُشغِّل يثبّت بذوره (تبديل المطالبات، أخذ عينات الحمولة، RNG لأخذ العينات، torch.manual_seed) ويستهلك المطالبات من تدفق مطالبات حتمي وواعٍ بالتمريرات، لذا يمكن إعادة إنتاج مسح كامل من البداية إلى النهاية ويستأنف تمامًا من نقطة تفتيشه بعد الانقطاع.
OPENAI_API_key.txt و *.key و .env كلها متجاهَلة.| المسار | الوصف |
|---|
arithmetic.py, arithmetic_batch.py | تشفير خفي بالترميز الحسابي (مُرمِّز/فكّاك تدفق مفرد + مُجمّع). |
discop.py, discop_batch.py | مُرمِّز Discop الخفي + PRG مشترك (مفرد + مُجمّع). |
utils.py | أدوات مساعدة مشتركة (تحويل بت/عدد صحيح، إنتروبيا، top-k، فحوصات نهاية الجملة). |
protocol.py | بروتوكول HiTMS متعدد التدفقات (تعيين التدفقات، الخداع، الترويسات، الحشو). |
single_stream.py | بروتوكول أحادي التدفق (بدون تأطير؛ اقتطاع عند البت L). |
round_trip.py, batch_round_trip.py | عروض/اختبارات رحلة ذهاب وإياب أحادية اللقطة وبسيطة. |
multi_round_demo.py | مُشغِّل محاولات متعدد التدفقات (run_trial) + عرض توضيحي لمحاولة واحدة مفصّل. |
single_stream_demo.py | مُشغِّل محاولات أحادي التدفق (run_single_trial) + عرض توضيحي. |
run_sweep.py | مسح متعدد التدفقات عبر {model}×{pool}×{coder}، قابل للاستئناف. |
run_single_sweep.py | مسح مقابل أحادي التدفق. |
run_scaling_sweep.py | مسح توسّع عدد التدفقات (x ∈ {1,2,4,8,16,32,64})، أي نموذج/مجمّع/مُرمِّز. |
run_x1_shards.py, run_x1_finish.sh, merge_x1_shards.py | إلغاء x=1: تقسيم خلية واحدة عبر GPUs، ثم دمج مع فحوصات التغطية. |
judge_quality.py | مُقيِّم LLM-كحَكَم لعدم الإدراك (سؤال وجواب واحد لكل استدعاء، قابل للاستئناف). |
gen_cover.py | توليد نص "غطاء" بدون حمولة (مرجع لتحليل الاستeganography). |
steganalysis_bert.py | كاشف غطاء-مقابل-نص-خفي (BERT / RoBERTa / DeBERTa-v3 / ELECTRA). |
export_data.py | يبني المرآة القابلة للنشر والملخّصة فقط في data/. |
build_question_pool.py, build_norobots_pool.py | يبنيان مجمّعات الأسئلة من مجموعات بيانات HF. |
*_creative_questions.json | مجمّعات أسئلة مبنية مسبقًا. |
legacy/ | نصوص/مجمّعات سابقة، محفوظة للرجوع إليها. |