
أداة إخفاء صور بسيطة بلغة C++ لتشفير وإخفاء الملفات داخل الصور باستخدام ترميز البت الأقل أهمية.
أداة بسيطة مكتوبة بلغة C++ تستخدم التشفير وإخفاء البيانات لحماية محتويات ملف، ثم تقوم بتضمينها داخل بيانات البكسل في الصورة باستخدام ترميز البت الأقل أهمية (LSB). تعمل على أنظمة Linux وMacOS وWindows.
$ ./steganography encode -i data/orig.png -e data/jekyll_and_hyde.zip -o output.png
Password: 1234
* Image size: 640x426 pixels
* Encoding level: Low (Default)
* Max embed size: 132.38 KiB
* Embed size: 61.77 KiB
* Encrypted embed size: 61.78 KiB
* Generated CRC32 checksum
* Generated encryption key with PBKDF2-HMAC-SHA-256 (20000 rounds)
* Encrypted embed with AES-256-CBC
* Embedded jekyll_and_hyde.zip into image
* Sucessfully wrote to output.png
الصورة الأصلية:

صورة تحتوي على ملف ZIP مضمن يحتوي على كامل محتويات كتاب "د. جيكل والسيد هايد":

$ ./steganography decode -i output.png -o "out - jekyll_and_hyde.zip"
Password: 1234
* Image size: 640x426 pixels
* Generated decryption key with PBKDF2-HMAC-SHA-256 (20000 rounds)
* Sucessfully decrypted header
* File signatures match
* Detected embed jekyll_and_hyde.zip
* Encoding level: Low (Default)
* Encrypted embed size: 61.78 KiB
* Successfully decrypted the embed
* Decrypted embed size: 61.77 KiB
* CRC32 checksum matches
* Successfully wrote to out - jekyll_and_hyde.zip
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ make -j 4
Usage: steganography [-h] {decode,encode}
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
Subcommands:
decode Decodes and extracts an embed-file from an image
encode Encodes an embed-file into an image
Usage: encode [-h] --input VAR --output VAR --embed VAR [--passwd VAR]
Encodes an embed-file into an image
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
-i, --input specify the input image. [required]
-o, --output specify the output image. [required]
-e, --embed specify the file to embed. [required]
-p, --passwd specify the encryption password.
Usage: decode [-h] --input VAR [--output VAR] [--passwd VAR]
Decodes and extracts an embed-file from an image
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
-i, --input specify the input image. [required]
-o, --output specify the output file. [default: ""]
-p, --passwd specify the encryption password.
يعمل البرنامج أولاً عن طريق توليد عشوائي لـ 128-bit Password Salt و 128-bit AES Initialization Vector من خلال قراءة بيانات ثنائية من /dev/urandom. ثم يستخدم Password Salt كمعامل في توليد مفتاح تشفير، باستخدام PBKDF2-HMAC-SHA-256 على سلسلة نصية يدخلها المستخدم. ثم يتم حساب تجزئة CRC32 للملف المراد تضمينه، وتخزينها في الرأس (header) لتعمل كمجموع تدقيقي لصحة البيانات. بعد ذلك يتم حشو البيانات الثنائية للملف باستخدام خوارزمية PKCS #7، ثم يتم تشفير كل من الرأس والبيانات المحشوة باستخدام AES-256 في وضع CBC، باستخدام Initialization Vector الذي تم توليده سابقاً. الآن يتم تضمين البيانات فعلياً داخل الصورة عن طريق اختيار إزاحة عشوائية أولاً، ثم المرور عبر كل بت من البيانات وتخزينها داخل بيانات بكسل الصورة الفعلية، وذلك بتعيين البت الأقل أهمية لكل قناة بايت في كل بكسل.
تعمل عملية فك التضمين تماماً مثل عملية التضمين الموصوفة أعلاه، ولكن بالعكس. الفرق الوحيد هو أنه أثناء فك التضمين، بعد محاولة البرنامج استخراج البيانات وفك تشفيرها، يقوم بمقارنة بعض المعلومات في قسم الرأس في محاولة للتحقق من صحة عملية الاستخراج. حقول الرأس التي تتم مقارنتها هي: توقيع الملف المكون من 4 بايت الخاص بهذا البرنامج، وتجزئة CRC32 للبيانات المفكوكة. إذا لم يتطابق أي من هذه الحقول مع قيمها الصحيحة، ستفشل عملية فك التشفير. يجب أن يحدث هذا فقط إذا كان الملف الذي تحاول فك تشفيره لا يحتوي فعلياً على تضمين، أو إذا كانت كلمة المرور التي أدخلتها خاطئة، أو إذا كان ملف الصورة تالفاً لسبب ما.
على الرغم من أن اكتشاف وجود بيانات مضمنة في صورة ما هي مهمة سهلة، إلا أنه نظرياً لا توجد طريقة لمعرفة أن هذا البرنامج هو من قام بذلك، ونظرياً لا ينبغي أن تكون هناك طريقة معروفة لفك تشفير البيانات دون معرفة كلمة المرور، وذلك دون إنفاق ملايين السنين في عملية القيام بذلك.
لا تستخدم هذا البرنامج لتشفير وإخفاء بيانات مهمة ترغب في إبعادها عن أعين المتطفلين. هذا مجرد برنامج بسيط لإثبات المفهوم (proof-of-concept) صنعته للمتعة. أنا لست خبير تشفير. أنا مجرد هاوٍ، استخدمه على مسؤوليتك الخاصة.
هذا البرنامج مرخص بموجب MIT. حقوق النشر © 2022 Zach Collins