العودة إلى التحديثات
UpdatedSep 2, 2026

jdvrif — Updated!

أداة إخفاء البيانات في صور JPG

مشاركة

jdvrif

jdvrif (JPG Data Vehicle) هي أداة سطر أوامر سريعة وسهلة الاستخدام لإخفاء البيانات (steganography) تُستخدم لإخفاء واستخراج أي نوع من الملفات عبر صورة JPG. لينكس فقط.

يتم ضغط ملف بياناتك باستخدام libdeflate/zlib، ثم تشفيره باستخدام XChaCha20-Poly1305 (libsodium secretstream) بمفتاح مشتق بواسطة Argon2id من رمز استرداد PIN مُولَّد عشوائيًا، ثم يُضمَّن أخيرًا في صورة الغلاف. يُعرض رمز PIN مرة واحدة فقط، في نهاية عملية conceal، ولا يُخزَّن في أي مكان على الإطلاق: فبدونه لا يمكن استرداد الملف المخفي.

باستخدام وضع الإخفاء الافتراضي، يمكنك إخفاء أي نوع من الملفات، مع تحديد حجم الصورة النهائية بحد أقصى 2GiB. أما أوضاع الإخفاء الأخرى الخاصة بالمنصات ومواقع التواصل الاجتماعي المتوافقة (المذكورة أدناه) فلها حدود حجم خاصة بها أصغر بكثير ومتطلبات أخرى.

تتوفر نسخة ويب من jdvrif، يمكنك استخدامها فورًا كبديل مريح عن تنزيل شيفرة المصدر الخاصة بواجهة سطر الأوامر (CLI) وترجمتها. تقتصر عمليات رفع الملفات عبر الويب على 20MiB.

تتوفر أيضًا نسخة تجريبية مكتوبة بلغة Rust jdvrif-rs لمن يهتم بتلك اللغة. وهي متوافقة من حيث الصيغة: إذ يمكن لأي من البنيتين استرداد صور الأخرى.

تستند jdvrif جزئيًا إلى التقنية المُنفَّذة من قبل الباحث الأمني David Buchanan.

Demo Image
صورة توضيحية: "A place of concealment" / PIN: 7912872750612437051

كيف تُخفي jdvrif البيانات

على عكس طريقة الإخفاء الشائعة LSB (أقل بت دلالة) التي تُخفي البيانات داخل بكسلات صورة الغلاف، فإن jdvrif تُخفي البيانات في الغالب داخل مقاطع التطبيقات (application segments) لصورة JPG (ICC، EXIF، XMP، إلخ).

وضع الإخفاءأين تذهب البياناتمشاركة الصورة الناتجة على
(بدون خيار)مقاطع ملف التعريف APP2/ICCX-Twitter، Tumblr، Mastodon، Pixelfed، PostImage، ImgBB، ImgPile، Flickr
-bمقاطع EXIF / Photoshop / XMP المؤطَّرةBluesky فقط
-rمعاملات JPEG DCT (QIM)Reddit فقط
-xمعاملات JPEG DCT (J-UNIWARD/STC)X-Twitter فقط

الاستثناءان الوحيدان من طريقة تخزين المقاطع الافتراضية هما Reddit وX-Twitter. فكلاهما له وضع إخفاء خاص به، ولا يستخدم أي من هذين الوضعين مقاطع البيانات الوصفية على الإطلاق: إذ تحمل -r و***-x*** الحمولة في معاملات DCT الخاصة بصورة JPG بدلًا من ذلك.

تُعيد Reddit ترميز الصور المرفوعة وتتجاهل مقاطع البيانات الوصفية التي يعتمد عليها الوضع الافتراضي، لذا فإن -r هو الوضع الوحيد الذي يعمل هناك. أما X-Twitter فتحتفظ بمقطع ICC واحد صغير، لذا لا يزال الوضع الافتراضي يعمل على تلك المنصة، لكن فقط لحمولة صغيرة جدًا.

بالنسبة لوضع الإخفاء الخاص بـ Reddit (-r)، نستخدم طريقة إخفاء QIM (تضمين مؤشر التكميم في نطاق JPEG DCT)، إذ إنها طريقة التخزين الوحيدة التي تعمل حاليًا مع Reddit. تُحوَّل صورة الغلاف إلى baseline Q75 4:2:0 وتُحمَل الحمولة في كتل DCT الخاصة بالإضاءة (luminance) لديها.

لتعظيم سعة التخزين لمنصة Reddit، استخدم صورة غلاف بأبعاد كبيرة، مثل 2048x2048، 4096x4096، 8192x8192 (الحد الأقصى)، إلخ.

جودة صورة الغلاف ليست مهمة لهذه الطريقة، وينبغي إبقاؤها بسيطة عند الأبعاد الكبيرة للمساعدة في تقليل حجم ملف صورة الغلاف إلى الحد الأدنى.

في حين أن منصة X-Twitter يمكنها استخدام الطريقة الافتراضية التي توفرها jdvrif، حيث تُخفى البيانات داخل مقاطع APP2/ICC، فإن X-Twitter تحدّ ذلك بمقطع ICC واحد بحد أقصى للحجم لا يتجاوز ~10KiB فقط.

لحمل أكثر من ~10KiB، استخدم وضع الإخفاء الخاص بمنصة X-Twitter (-x). يتخلى هذا الوضع عن مقاطع البيانات الوصفية بالكامل — فلا يُكتب أي شيء إلى ملف تعريف ICC — ويستخدم بدلاً من ذلك طريقة إخفاء المعلومات التكيفية J-UNIWARD مع ترميز Syndrome-Trellis (STC). يُعاد ترميز صورة الغلاف إلى 4:2:0 تدريجية بالجودة المستمدة من مصدرها (بحد أقصى Q97).

لتعظيم سعة التخزين لمنصة X-Twitter، استخدم صورة غلاف عالية الجودة/غنية بالتفاصيل بأبعاد كبيرة، مثل 1024x1024، 2048x2048، 4096x4096 (الحد الأقصى)، إلخ.

يقوم الحاملان -r و***-x*** بتشفير بياناتك وربط موقعها برمز الاسترداد PIN الخاص بك باستخدام Argon2id، لكن التضمين لا يزال يغيّر إحصاءات DCT للصورة، لذا قد يكشف تحليل الإخفاء المتخصص أن الصورة تحمل بيانات مخفية.

تظل صور -r و***-x*** التي أُنشئت باستخدام jdvrif v9.0 قابلة للاسترداد، لكن v9.0 لا يمكنه استرداد صور -r أو -x التي أُنشئت باستخدام v9.1.

يحمل كلا وضعي DCT بيانات أقل بكثير من الوضع الافتراضي، لذا استخدم capsize لقياس صورة الغلاف قبل اختيار الحمولة (انظر التحقق من السعة).

المتطلبات والترجمة البرمجية (Linux)

تتطلب عملية البناء CMake 3.20 أو أحدث، وflock من util-linux، وإما Ninja (المفضّل) أو Make. يجب أن يكون المترجم GCC 14 أو أحدث، أو Clang 18 أو أحدث مقترنًا بمكتبة قياسية C++23 تنفّذ ميزات مثل std::format وstd::print. المكتبات الأصلية المطلوبة هي libsodium، وlibjpeg-turbo (كل من واجهتي turbojpeg وlibjpeg)، وzlib، وlibdeflate. OpenMP اختياري: عند توفره فإنه يوازي تمريرة حساب التكلفة الخاصة بـ J-UNIWARD في -x.

$ sudo apt update
$ sudo apt install g++ cmake ninja-build util-linux libsodium-dev libturbojpeg0-dev libjpeg-dev zlib1g-dev libdeflate-dev

$ g++ --version   # confirm the reported version is 14 or newer

$ chmod +x compile_jdvrif.sh
$ ./compile_jdvrif.sh

$ sudo cp jdvrif /usr/bin

إذا كانت توزيعتك توفّر GCC 14 كحزمة ذات إصدار محدد، فثبّت g++-14 وابنِ باستخدام CXX=g++-14 ./compile_jdvrif.sh.

يحتفظ الغلاف بملفات الكائنات المتتبَّعة للاعتماديات تحت src/build/، لذا تعيد الاستدعاءات اللاحقة بناء ما تغيّر فقط، ولا يستبدل الملف التنفيذي jdvrif المنشور إلا بعد بناء كامل وناجح. اضبط JDVRIF_JOBS=<count> لتغيير حد التوازي (الافتراضي: عدد وحدات المعالجة المركزية، بحد أقصى 8)، أو JDVRIF_BUILD_DIR=<path> لاستخدام ذاكرة تخزين مؤقت منفصلة للبناء، أو BUILD_MODE=sanitize لبناء ASan/UBSan.

الاستخدام

$ jdvrif

Usage: jdvrif conceal [-b|-r|-x] <cover_image> <secret_file>
       jdvrif recover <cover_image>
       jdvrif capsize [-r|-x] <cover_image>
       jdvrif --info

شغّل jdvrif --info للحصول على الدليل المدمج الكامل للأوضاع وخيارات المنصات وحدود الحجم.

$ jdvrif conceal your_cover_image.jpg your_secret_file.doc

Platform compatibility for output image:-

 ✓ X-Twitter
 ✓ Tumblr
 ✓ Mastodon
 ✓ Pixelfed
 ✓ PostImage
 ✓ ImgBB
 ✓ ImgPile
 ✓ Flickr

Recovery PIN: [***2166776980318349924***]

Important: Keep your PIN safe, so that you can extract the hidden file.


Saved "file-embedded" JPG image: jrif_4e87c566c.jpg (143029 bytes).

Complete!

$ jdvrif recover jrif_4e87c566c.jpg

PIN: *******************

Extracted hidden file: your_secret_file.doc (6165 bytes).

Complete! Please check your file.

jdvrif mode arguments:

conceal - يضغط ويشفّر ويضمّن ملف بياناتك السري داخل صورة غلاف JPG.
recover - يفكّ التشفير ويفكّ الضغط ويستخرج ملف البيانات المخفي من صورة غلاف JPG (يتطلب رقم PIN للاستعادة).
capsize - يبلّغ عن سعة الحمل لصورة غلاف من أجل الوضع -r أو -x. لا يتم حفظ أي صورة.

متطلبات صورة الغلاف:

● JPEG فقط، بحجم 400x400 بكسل على الأقل، وبإحدى صيغتي التدرّج الرمادي أو ألوان YCbCr — يجب تحويل صور CMYK/YCCK إلى RGB أولاً.

● الأبعاد العليا الافتراضية وأبعاد -b هي 4096x4096px؛ يستخدم -r حدّ 8192x8192px، بينما يقتصر -x أيضاً على 4096x4096px.

الفئات