به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
شاید راجع به پنهان نگاری یا استگانوگرافی (Steganography) چیزی شنیده باشین. در واقع استگانوگرافی هنر پنهان کردن داده ها (Data Hiding) در یک رسانه مثل صدا، تصویر یا فیلم هست. یعنی شما میتونین در یک تصویری که متعلق به یک منظره است یکسری اطلاعات (فایل یا نوشته) رو مخفی کنین به طوری که شخص با باز کردن تصویر متوجه اون اطلاعات پنهان نگاری شده نمیشه و صرفاً یک عکس معمولی رو بدون تغییر حجم شاخص و یا تغییر رنگ میبینه. شاید بپرسین تفاوت پنهان نگاری با رمزنگاری (Encryption) چیه؟
در رمزنگاری ما اطلاعات رو رمز میکنیم و خروجی پروسه رمزنگاری یکسری عبارات نامفهوم هست که برای هر کسی قابل مشاهده است. اما در پنهان نگاری ما یکسری اطلاعات رو مخفی میکنیم و این اطلاعات مخفی شده به سادگی قابل مشاهده نیست. امروز من قصد دارم روی استگانوگرافی تصاویر تمرکز کنم. دو تکنیک رایج در پنهان نگاری تصاویر وجود داره. ساده ترین تکنیک استفاده از LSB (Least Significant Bit( هست که جزء دسته اول تکنیک ها یعنی Spatial Domain به حساب میاد. LSB یا کم ارزش ترین بیت مفهومی هست که در عدد نویسی دودویی (باینری) به کار میره. به زبان ساده LSB مشابه یکان در سیستم عددنویسی ده دهی (دسیمال) هست. همونطور که آگاه هستین در رایانه هر تصویر متشکل از چندین عدد پیکسل (Pixel) هست. برای مثال یک تصویر با ابعاد 240 × 240 شامل 57600 عدد پیکسل هست. تعداد پیکسل های هر تصویر از ضرب ابعاد تصویر در هم دیگه به دست میاد. هر پیکسل یک خانه بسیار کوچک هست که با یک عدد باینری وضعیت رنگ اون پیکسل مشخص میشه. رایانه شما با کنار هم قرار دادن مقادیر باینری هر پیکسل یک تصویر رو بازآفرینی یا ایجاد میکنه. پس درک رایانه از یک تصویر زیبا از منظره ای بکر برای رایانه چیزی جزء صفر و یک و مقادیر باینری نیست. در ساده ترین تکنیک استگانوگرافی، میتونیم اطلاعات موردنظرمون رو بین مقادیر باینری LSB توزیع کنیم چرا که این بیت ها مقادیر کوچکی هستن و برای تزریق اطلاعات اضافی فضای مناسبی ایجاد میکنن.
دسته دوم تکنیک ها که Frequency Domain نام داره نسبت به تکنیک LSB پیچیده تر هست. چون توضیحات مربوط به این تکنیک خیلی طولانی میشه پس من به بیان یکسری کلیات بسنده میکنم و میرم سر اصل مطلب. تکنیک Frequency Domain عموماً برای تصاویری با فرمت JPG به کار میره. تصاویری که در فرمت JPG هستن عملاً فشرده شده هستن پس ما باید اطلاعات موردنظرمون رو با الگوریتم های DCT یا FFT به تصویر تزریق کنیم.
چطور در کانستراکت پنهان نگاری (استگانوگرافی) را به کار ببندیم؟
ما میتونیم به راحتی از طریق یک کد PHP هر اطلاعاتی که مدنظرمون هست رو در تصاویر پنهان نگاری کنیم. من به خاطر اینکه پروسه چندان پیچیده ای نداشته باشیم از روش LSB استفاده کردم. توضیحات مکانیزم کد که اتفاقاً بسیار ساده هم هست رو در ادامه بیان میکنم. متأسفانه با روش LSB نمیشه فایلها رو در داخل تصاویر تزریق کرد و فقط امکان اضافه کردن رشته ها وجود داره چرا که اگر بخوایم فایلها رو هم به تصاویر تزریق کنیم مدت زمان اجرای برنامه (Execution Time) که در پی اچ پی 20 ثانیه است افزایش پیدا میکنه و مفسر PHP به ما اجازه این کارو نمیده. البته میشه Execution Time پی اچ پی رو از تنظیماتش افزایش داد ولی کلاً پنهان نگاری فایلها نسبت به رشته های ساده متنی بسیار پیچیده تره . من در این کد امکان رمزنگاری اطلاعاتی که قراره در تصویر پنهان نگاری بشن رو فراهم کردم تا اگر مهاجم موفق شد به محتویات پنهان نگاری شده پی ببره حداقل چیزی متوجه نشه و با عبارات نامفهوم مواجه بشه.
ما دو فایل PHP داریم:
فایل encrypt.php :
این فایل قادره اطلاعاتی که ما میخوایم رو در داخل تصاویر با فرمت JPG پنهان نگاری کنه. بعد از اجرای موفقیت آمیز این کد یک فایل تصویری با فرمت PNG ایجاد میشه که در واقع خروجی کد ما هست و اطلاعات پنهان نگاری شده در اون تصویر موجوده. قبل از هر چیزی کدهای PHP زیر رو در سرور یا هاستتون ذخیره کنین و بعد از اون به کمک شیء اِی جَکس (AJAX) به این فایل درخواست ارسال میکنیم.
(دقت کنین که فایل PHP رو در دایرکتوری یا مسیری ذخیره کنین که تصاویر موردنظرتون جهت پنهان نگاری وجود داره. در ضمن تصاویر خروجی این کد هم در مسیر یا دایرکتوری که فایل PHP قرار داره ذخیره میشن.)حالا اکشن Post To URL شیء AJAX رو انتخاب کنین. برای پارامتر Tag میتونین هر مقدار دلخواهی رو اعمال کنین و یا اصلاً مقداری بهش ندین. برای پارامتر URL باید آدرس فایل PHP خودتون رو وارد کنین. مثلاً آدرس فایل PHP شما ممکنه به این شکل باشه:پارامتر Data رو با چنین فرمتی تعریف کنین:همونطور که مشخصه ما در ارسال این ریکوئست به فایل PHP با چهارتا پارامتر مواجه هستیم. پارامتر image در واقع نام تصویری که قصد داریم در اون استگانوگرافی انجام بدیم رو مشخص میکنه. مقدار این پارامتر باید نام فایل تصویری به همراه درج فرمت تصویری JPG باشه. پارامتر decryption_key کلید رمزگشایی اطلاعات رو مشخص میکنه. به خاطر مهم بودن نقش کلید تعیین شده در امنیت اطلاعات ذخیره شده من قواعد تقریباً سر سختانه ای برای کلید تعیین کردم. کلیدی که تعیین می کنین باید شامل دست کم 20 کاراکتر و حروف بزرگ، حروف کوچک، اعداد و کاراکترهای خاص (مثل @ یا $) باشه. اما توصیه من به شما برای تعیین کلید اینه که اجازه بدین خود برنامه براتون یک کلید ایجاد کنه. برای این منظور کافیه مقدار پارامتر decryption_key رو دقیقاً برابر با random قرار بدین. با این کار برنامه PHP یک کلید 128 بیتی ایمن (شامل 256 کاراکتر ASCII) ایجاد میکنه و مقدار اون رو در خروجی به شما نمایش میده تا بدونین کلیدی که برنامه انتخاب کرده چی هست.
پارامتر output_image نام تصویر خروجی رو مشخص میکنه. همونطور که گفتم پس از اجرای موفقیت آمیز کد یک تصویر پنهان نگاری شده با فرمت PNG دقیقاً مشابه تصویر اولیه که فرمت JPG داشت ایجاد میشه. مقدار این پارامتر میتونه هر مقدار دلخواهی باشه فقط باید دقت کنین که از درج فرمت .png پرهیز کنین و نامی که برای فایل خروجی انتخاب میکنین از قبل در سرور یا هاستتون موجود نباشه. اگر ایده ای برای نام فایل خروجی نداشتین میتونین مقدار این پارامتر رو دقیقاً برابر با random قرار بدین تا PHP یک نام تصادفی 8 کاراکتری شامل اعداد و حروف برای شما ایجاد کنه و در خروجی نمایش بده.
پارامتر data هم اطلاعاتی که قصد داریم در تصویر پنهان نگاری کنیم رو مشخص میکنه. مقدار این پارامتر میتونه یک رشته متنی باشه.
نکته مـهم: شما نمیتونین هر رشته ای رو داخل هر تصویری تزریق کنین. یعنی باید تعداد بیت های اطلاعاتی که قصد دارین پنهان نگاری کنین (در واقع تعداد بیت های رشته تون) کوچکتر مساوی حاصلضرب ابعاد تصویر باشه. شاید بپرسین که چرا اینطور هست. اگر یادتون باشه در بخش اول توضیحاتم گفتم که تعداد پیکسل های هر تصویر برابره با حاصلضرب ابعاد تصویر. فرض کنین یک تصویر 50×20 دارین. تصویر شما متشکل از 1000 پیکسل هست. حالا شما قصد دارین یک رشته 2000 بیتی رو پنهان نگاری کنین. خُب از نظر منطقی وقتی نهایتاً 1000 پیکسل وجود داره چطور هر بیت از 2000 بیت اطلاعاتی که داریم در هر یک از 1000 پیسکل میتونه تزریق بشه؟ کاملاً واضحه که چنین چیزی از نظر منطقی ممکن نیست. پس برای حل چنین مشکلی باید تصویری با ابعاد بزرگتر در نظر بگیرین. لازم نیست نگران این موضوع باشین چرا که برنامه PHP که نوشتم به صورت خودکار همه این موارد رو محاسبه میکنه و اگر تعداد بیت های پیام با حاصلضرب ابعاد تصویر (تعداد پیکسل ها) متناسب نبود پیغام های مربوطه رو به شما نمایش میده.
در حاشیه: اگر مایل هستین که تصویر JPG که قصد دارین باهاش پنهان نگاری کنین رو حذف کنین میتونین پارامتر delete رو هم به ریکوئست اضافه کنین. اگر مقدار این پارامتر رو دقیقاً برابر با yes قرار بدین تصویر JPG که قصد دارین باهاش پنهان نگاری کنین از هاست یا سرورتون حذف میشه. با این توضیحات فرمت کلی ریکوئست شما در صورتی که بخواین از این پارامتر استفاده کنین به این شکل میشه:ارورها و پیغام های فایل encrypt.php :(x بیانگر ظرفیت نهایی تصویر برای ذخیره سازی اطلاعات بر حسب بیت و y بیانگر تعداد بیت هایی است که شما قصد ذخیره سازی دارید اما به دلیل عدم متناسب بودن با x پروسه پنهان نگاری انجام نمی شود.)(عبارت a بیانگر تعداد ارورهای یافت شده است.)(عبارت X بیانگر نام فایل خروجی، Y بیانگر تعداد بیت های پنهان شده در تصویر خروجی، M بیانگر درصد اشغال پیکسل های تصویر به صورت تقریبی و C بیانگر کلید رمزگشایی است.)
درصد اشغال پیکسل های تصویر:
در واقع این مشخصه از طریق یک نسبت و تناسب ساده محاسبه میشه. اگر بخوایم یک تابع ریاضی برای این مشخصه تعریف کنیم میتونیم بگیم:دقت کنین که این برنامه PHP حاصل به دست اومده رو به بالا گرد میکنه تا رُند بشه.
فایل decrypt.php :
این فایل قادره اطلاعاتی که در تصاویر خروجی با فرمت PNG پنهان نگاری کردیم رو استخراج کنه. بعد از اجرای موفقیت آمیز این کد مقدار رمزنگاری شده اطلاعات ذخیره شده و مقدار رمزگشایی شده اطلاعات ذخیره شده در صورت وارد کردن کلید رمزگشایی که از فایل encrypt.php به دست آوردیم نمایش داده میشه. پروسه ای که در این فایل انجام میشه نسبت به پروسه ای که در فایل اول انجام میشد به مراتب ساده تره. در این فایل تنها خوانش مقادیر LSB پیکسل های تصویر صورت میگیره اما در فایل encrypt.php مقادیر باینری به مقادیر LSB هر پیکسل اضافه میشه.
(دقت کنین که فایل PHP رو در دایرکتوری یا مسیری ذخیره کنین که تصاویر موردنظرتون جهت استخراج اطلاعات پنهان نگاری شده وجود داره.)حالا اکشن Post To URL شیء AJAX رو انتخاب کنین. برای پارامتر Tag میتونین هر مقدار دلخواهی رو اعمال کنین و یا اصلاً مقداری بهش ندین. برای پارامتر URL باید آدرس فایل PHP خودتون رو وارد کنین. مثلاً آدرس فایل PHP شما ممکنه به این شکل باشه:پارامتر Data رو با چنین فرمتی تعریف کنین:همونطور که مشخصه ما در ارسال این ریکوئست به فایل PHP با دوتا پارامتر مواجه هستیم. پارامتر image در واقع نام تصویری که قصد داریم اطلاعات استگانوگرافی شده رو ازش استخراج کنیم رو مشخص میکنه. مقدار این پارامتر باید نام فایل تصویری بدون درج فرمت PNG باشه. پارامتر decryption_key کلید رمزگشایی اطلاعات رو مشخص میکنه که در مرحله پنهان نگاری دریافت کردیم.
در حاشیه: اگر مایل هستین که تصویر PNG پنهان نگاری شده رو حذف کنین میتونین پارامتر delete رو هم به ریکوئست اضافه کنین. اگر مقدار این پارامتر رو دقیقاً برابر با yes قرار بدین تصویر PNG که پنهان نگاری کردین و در پارامتر image تعیین کردین از هاست یا سرورتون حذف میشه. با این توضیحات فرمت کلی ریکوئست شما در صورتی که بخواین از این پارامتر استفاده کنین به این شکل میشه:(w بیانگر نام تصویر PNG حذف شده از سرور یا هاست هست.)
ارورها و پیغام های فایل decrypt.php :(عبارت x بیانگر نام فایل وارد شده است.)(عبارت a بیانگر تعداد ارورهای یافت شده است.)(عبارت G بیانگر عبارت پنهان نگاری شده به حالت رمزنگاری شده، B بیانگر اطلاعات رمزگشایی شده پنهان در تصویر، Y بیانگر تعداد بیت های پیام مخفی شده در تصویر و J هم بیانگر درصد اشغال پیکسل های تصویر هست.)
دقیقاً چطور اطلاعات موردنظر در فایل تصویری پنهان نگاری می شوند؟
همونطور که آگاه هستیم و بیان شد هر تصویر متشکل از چندین پیکسل هست که تعداد پیکسل های یک تصویر دلخواه از حاصلضرب ابعاد تصویر به دست میاد. هر پیکسل با سه مقدار باینری مشخص میشه. یک یا چند بیت برای رنگ سبز (Green)، یک یا چند بیت برای رنگ قرمز (Red) و یک یا چند بیت برای رنگ مشکی (Black) به کار میره. در واقع در دنیای رایانه رنگ هر پیکسل رو با شاخصی به نام RGB تعیین میکنن. یعنی به بیان دیگه مبنای رنگ ها در دنیای رایانه سه رنگ سبز، قرمز و مشکی هستن. هر یک از این سه رنگ (کامپوننت ها) برای هر پیکسل همونطور که گفته شد با سه مقدار باینری مشخص میشن. تلفیق مقادیر باینری R،G و B هر پیکسل در واقع رنگ نهایی اون پیکسل رو مشخص میکنه.
فرض کنین یک پیکسل از تصویر مقادیر باینری R، G و B به این شکل داشته باشه:
برگردیم به استگانوگرافی یا پنهان نگاری خودمون. همونطور که گفتم ما در پنهان نگاری در بیت های LSB تغییر ایجاد میکنیم. این تغییرات که توسط ما ایجاد میشن مسلماً باعث تغییر رنگ تصویر خروجی میشن اما این تغییر رنگ اونقدر کوچیکه که با چشم انسان قابل فهم نیست.
فرض کنین من میخوام پیام 4 بیتی (1101) رو در یک تصویر پنهان نگاری کنم. من قصد دارم تنها مشخصه B (آبی) پیکسل های تصویر رو تغییر بدم. پس طبیعتاً برای ذخیره کردن 4 بیت پیامی که دارم تصویر من باید دست کم حاوی 4 پیکسل باشه. با این حساب من باید پیامم رو در بین چهار پیکسل توزیع کنم.
حالا مقدار RGB چهار پیکسل دلخواه از تصویر رو دریافت میکنم. فرض کنین مقادیر RGB چهار پیکسل دلخواهی که انتخاب کردم به این شکل باشه:
کاربردها و امنیت روش LSB برای پنهان نگاری اطلاعات در تصاویر:
این روش میتونه کاربردهای مختلفی از انتقال پیغام های سری بدون مشکوک شدن تا ذخیره سازی اطلاعات و هر کاربرد دیگه ای که مدنظر شما هست رو داشته باشه. این روش میتونه تا حد خوبی امنیت اطلاعات ذخیره شده رو حفظ کنه چرا که مهاجم یا مهاجمین هیچ مقدار رمزنگاری شده ای پیش روی خودشون مشاهده نمیکنن و اگر هم بتونن به پروسه ای که ما انجام دادیم پی ببرن باید از کلید رمزگشایی که تعیین کردیم برای رمزگشایی عبارت پنهان نگاری شده در تصویر استفاده کنن که با توجه به ایمن بودن روش رمزنگاری AES کرک سایفرها (Ciphers) با روش های بروت فورس (Brute-Force) و وردلیست برای یک رایانه خانگی سالها زمان میبره.
اگر من به شخصه قصد داشتم این روش رو به کار ببندم از اون به منظور ذخیره سازی کلید رمزگشایی اطلاعات ذخیره شده از کاربرانم در دیتابیس استفاده میکردم. یعنی برای اطلاعات هر کاربر در دیتابیس خودم یک کلید رمزگشایی منحصر به فرد تعریف میکردم و اون کلید رو به عنوان مثال در تصویر پروفایل کاربر به صورت رمزنگاری شده پنهان نگاری میکردم.
امیدوارم از این مطلب لذت برده باشین.
خوشحال میشم که نظراتتون رو به حقیر گوشزد کنین و اگر جایی مشکل یا بدفهمی وجود داشت حتماً اعلام کنین.
برای نوشتن کدهای این مطلب و توضیحات اون زمان زیادی صرف شده که امیدوارم باعث پربار شدن مطلب شده باشه.
با آرزوی بهترین ها...
سلام دوستان امیدوارم حالتون خوب باشه...
شاید راجع به پنهان نگاری یا استگانوگرافی (Steganography) چیزی شنیده باشین. در واقع استگانوگرافی هنر پنهان کردن داده ها (Data Hiding) در یک رسانه مثل صدا، تصویر یا فیلم هست. یعنی شما میتونین در یک تصویری که متعلق به یک منظره است یکسری اطلاعات (فایل یا نوشته) رو مخفی کنین به طوری که شخص با باز کردن تصویر متوجه اون اطلاعات پنهان نگاری شده نمیشه و صرفاً یک عکس معمولی رو بدون تغییر حجم شاخص و یا تغییر رنگ میبینه. شاید بپرسین تفاوت پنهان نگاری با رمزنگاری (Encryption) چیه؟
در رمزنگاری ما اطلاعات رو رمز میکنیم و خروجی پروسه رمزنگاری یکسری عبارات نامفهوم هست که برای هر کسی قابل مشاهده است. اما در پنهان نگاری ما یکسری اطلاعات رو مخفی میکنیم و این اطلاعات مخفی شده به سادگی قابل مشاهده نیست. امروز من قصد دارم روی استگانوگرافی تصاویر تمرکز کنم. دو تکنیک رایج در پنهان نگاری تصاویر وجود داره. ساده ترین تکنیک استفاده از LSB (Least Significant Bit( هست که جزء دسته اول تکنیک ها یعنی Spatial Domain به حساب میاد. LSB یا کم ارزش ترین بیت مفهومی هست که در عدد نویسی دودویی (باینری) به کار میره. به زبان ساده LSB مشابه یکان در سیستم عددنویسی ده دهی (دسیمال) هست. همونطور که آگاه هستین در رایانه هر تصویر متشکل از چندین عدد پیکسل (Pixel) هست. برای مثال یک تصویر با ابعاد 240 × 240 شامل 57600 عدد پیکسل هست. تعداد پیکسل های هر تصویر از ضرب ابعاد تصویر در هم دیگه به دست میاد. هر پیکسل یک خانه بسیار کوچک هست که با یک عدد باینری وضعیت رنگ اون پیکسل مشخص میشه. رایانه شما با کنار هم قرار دادن مقادیر باینری هر پیکسل یک تصویر رو بازآفرینی یا ایجاد میکنه. پس درک رایانه از یک تصویر زیبا از منظره ای بکر برای رایانه چیزی جزء صفر و یک و مقادیر باینری نیست. در ساده ترین تکنیک استگانوگرافی، میتونیم اطلاعات موردنظرمون رو بین مقادیر باینری LSB توزیع کنیم چرا که این بیت ها مقادیر کوچکی هستن و برای تزریق اطلاعات اضافی فضای مناسبی ایجاد میکنن.
دسته دوم تکنیک ها که Frequency Domain نام داره نسبت به تکنیک LSB پیچیده تر هست. چون توضیحات مربوط به این تکنیک خیلی طولانی میشه پس من به بیان یکسری کلیات بسنده میکنم و میرم سر اصل مطلب. تکنیک Frequency Domain عموماً برای تصاویری با فرمت JPG به کار میره. تصاویری که در فرمت JPG هستن عملاً فشرده شده هستن پس ما باید اطلاعات موردنظرمون رو با الگوریتم های DCT یا FFT به تصویر تزریق کنیم.
چطور در کانستراکت پنهان نگاری (استگانوگرافی) را به کار ببندیم؟
ما میتونیم به راحتی از طریق یک کد PHP هر اطلاعاتی که مدنظرمون هست رو در تصاویر پنهان نگاری کنیم. من به خاطر اینکه پروسه چندان پیچیده ای نداشته باشیم از روش LSB استفاده کردم. توضیحات مکانیزم کد که اتفاقاً بسیار ساده هم هست رو در ادامه بیان میکنم. متأسفانه با روش LSB نمیشه فایلها رو در داخل تصاویر تزریق کرد و فقط امکان اضافه کردن رشته ها وجود داره چرا که اگر بخوایم فایلها رو هم به تصاویر تزریق کنیم مدت زمان اجرای برنامه (Execution Time) که در پی اچ پی 20 ثانیه است افزایش پیدا میکنه و مفسر PHP به ما اجازه این کارو نمیده. البته میشه Execution Time پی اچ پی رو از تنظیماتش افزایش داد ولی کلاً پنهان نگاری فایلها نسبت به رشته های ساده متنی بسیار پیچیده تره . من در این کد امکان رمزنگاری اطلاعاتی که قراره در تصویر پنهان نگاری بشن رو فراهم کردم تا اگر مهاجم موفق شد به محتویات پنهان نگاری شده پی ببره حداقل چیزی متوجه نشه و با عبارات نامفهوم مواجه بشه.
ما دو فایل PHP داریم:
- * encrypt.php (برای پنهان نگاری اطلاعات در تصویر)
- * decrypt.php (برای استخراج اطلاعات پنهان نگاری شده در تصویر)
فایل encrypt.php :
این فایل قادره اطلاعاتی که ما میخوایم رو در داخل تصاویر با فرمت JPG پنهان نگاری کنه. بعد از اجرای موفقیت آمیز این کد یک فایل تصویری با فرمت PNG ایجاد میشه که در واقع خروجی کد ما هست و اطلاعات پنهان نگاری شده در اون تصویر موجوده. قبل از هر چیزی کدهای PHP زیر رو در سرور یا هاستتون ذخیره کنین و بعد از اون به کمک شیء اِی جَکس (AJAX) به این فایل درخواست ارسال میکنیم.
(دقت کنین که فایل PHP رو در دایرکتوری یا مسیری ذخیره کنین که تصاویر موردنظرتون جهت پنهان نگاری وجود داره. در ضمن تصاویر خروجی این کد هم در مسیر یا دایرکتوری که فایل PHP قرار داره ذخیره میشن.)
کد php:
<?php
/**
* @author Master Badfar
* @copyright 2020
*/
// صدور مجوز ajax برای مرورگر
header('Access-Control-Allow-Origin: *');
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors', 0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// تعریف متغیر میزان ارور
$error = 0;
// فانکشن تبدیل متن عادی به باینری
function toBin($str){
$str = (string)$str;
$l = strlen($str);
$result = '';
while($l--){
$result = str_pad(decbin(ord($str[$l])),8,"0",STR_PAD_LEFT).$result;
}
return $result;
}
// تبدیل باینری به متن
function toString($str) {
$text_array = explode("\r\n", chunk_split($str, 8));
$newstring = '';
for ($n = 0; $n < count($text_array) - 1; $n++) {
$newstring .= chr(base_convert($text_array[$n], 2, 10));
}
return $newstring;
}
// بررسی پارامتر های وارده توسط کاربر
if(empty($_POST['data'])){
$error++;
echo "You should enter some data for steganography proccess." . '</br>';
}elseif(empty($_POST['image'])){
$error++;
echo "You should enter an image for steganography proccess." . '</br>';
}
if(empty($_POST['decryption_key'])){
$error++;
echo "You should enter a decryption key for steganography proccess." . '</br>';
}elseif(empty($_POST['output_image'])){
$error++;
echo "You should enter the name of the output image." . '</br>';
}
// ساخت نام تصادفی برای فایل طبق درخواست کاربر
if($_POST['output_image'] == "random" && !empty($_POST['output_image'])){
$mychar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$output = substr(str_shuffle($mychar) , 0 , 8);
if (file_exists($output . ".png")){
while(!file_exists($output.".png")){
$output = substr(str_shuffle($mychar) , 0 , 8);
}
}
}elseif ($_POST['output_image'] != "random" && !empty($_POST['output_image'])){
$output = $_POST['output_image'];
}
// بررسی موجود بودن تصویر وارده توسط کاربر
if(!file_exists($_POST['image']) && !empty($_POST['image'])){
$error++;
echo "The entered image can not be found." . '</br>';
// بررسی موجود بودن تصویر خروجی توسط کاربر
}elseif(file_exists($output . ".png")){
$error++;
echo "The output image is already avilable before!" . '</br>';
}
// ایجاد کلید تصادفی در صورت درخواست کاربر و درصورت عدم درخواست کاربر تعیین عبارت وارده به عنوان کلید
if($_POST['decryption_key'] == 'random' && !empty($_POST['decryption_key'])){
$encryption_key = bin2hex(openssl_random_pseudo_bytes(128));
}elseif ($error == 0 ){
$encryption_key = $_POST['decryption_key'];
}
// بررسی قدرت کلید انتخاب شده توسط کاربر
if (!empty($_POST['decryption_key']) && $_POST['decryption_key'] != "random"){
$uppercase = preg_match('@[A-Z]@', $_POST['decryption_key']);
$lowercase = preg_match('@[a-z]@', $_POST['decryption_key']);
$number = preg_match('@[0-9]@', $_POST['decryption_key']);
$specialChars = preg_match('@[^\w]@', $_POST['decryption_key']);
if(!$uppercase || !$lowercase || !$number || !$specialChars || strlen($_POST['decryption_key']) < 20 ) {
echo 'The key should be at least 20 characters in length and should include at least one upper case letter, one number, and one special character.' . '</br>';
$error++;
}
}
// نمایش تعداد کل ارورها
if($error > 0){
echo "Number of Total Errors that were found: " . $error;
}
// انجام پروسه در صورت موجود نبودن ارور
if ($error == 0){
// دریافت متن موردنظر جهت مخفی کردن
$message_to_hide = $_POST['data'];
// رمزنگاری متن موردنظر به روش AES
// تنظیم پارامترهای متد رمزنگاری openssl
$ciphering = "AES-128-CTR";
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;
//تنظیم پارامتر iv
$encryption_iv = '1234567891011121';
// رمزنگاری عبارت موردنظر
$msg = openssl_encrypt($_POST['data'], $ciphering,
$encryption_key, $options, $encryption_iv);
// انجام پروسه مخفی کردن اطلاعات در تصویر
$binary_message = toBin($msg);
$src = $_POST['image'];
$msg .='|';
$msgBin = toBin($msg);
$msgLength = strlen($msgBin);
$img = imagecreatefromjpeg($src);
list($width, $height, $type, $attr) = getimagesize($src);
$dimension = $width * $height;
if($msgLength>($width*$height)){ //The image has more bits than there are pixels in our image
echo('Message too long. You should choose a photo with higher dimensions.');
echo "You can store" . " " . $dimension . " bits in this picture but you are trying to store" . " " . $msgLength . " bits.";
die();
}
$pixelX=0;
$pixelY=0;
for($x=0;$x<$msgLength;$x++){
if($pixelX === $width+1){
$pixelY++;
$pixelX=0;
}
if($pixelY===$height && $pixelX===$width){
echo('Max Reached');
die();
}
$rgb = imagecolorat($img,$pixelX,$pixelY);
$r = ($rgb >>16) & 0xFF;
$g = ($rgb >>8) & 0xFF;
$b = $rgb & 0xFF;
$newR = $r;
$newG = $g;
$newB = toBin($b);
$newB[strlen($newB)-1] = $msgBin[$x];
$newB = toString($newB);
$new_color = imagecolorallocate($img,$newR,$newG,$newB);
imagesetpixel($img,$pixelX,$pixelY,$new_color);
$pixelX++;
}
imagepng($img,$output .'.png');
imagedestroy($img);
// نمایش پیغام های خروجی
echo "The steganography proccess done successfully!" . " " . "All the entered data was saved in ' " . $output . ".png" . " '." .'</br>';
echo strlen($msgBin) . " " . "bits is hidden now in the output image." .'</br>';
if(ceil(($msgLength * 100) / $dimension ) == 1){
echo "About" . " " . ceil(strlen($msgBin) * 100 / $dimension) . " percent of the photo capcity was used." . '</br>';
}elseif(ceil(strlen($msgBin) * 100 / $dimension ) > 1){
echo "About" . " " . ceil((strlen($msgBin) * 100 / $dimension)) . " percents of the photo capcity were used." . '</br>';
}
if ($_POST['delete'] = "yes" && !empty($_POST['delete'])){
unlink($_POST['image']);
echo "The file ' " . $_POST['image'] . " ' was deleted as you wished." . '</br>';
}
echo "Your decryption key is: " . $encryption_key . '</br>';
echo "You should be careful about storing your decryption key in a safe way.";
}
?>
کد:
http://yourhost.com/file.php
کد:
"image=" &"sample.jpg" & "&decryption_key=" & "random/anything_else" & "&output_image=" & "random/anything_else" & "&data=" & "yourdata!"
پارامتر output_image نام تصویر خروجی رو مشخص میکنه. همونطور که گفتم پس از اجرای موفقیت آمیز کد یک تصویر پنهان نگاری شده با فرمت PNG دقیقاً مشابه تصویر اولیه که فرمت JPG داشت ایجاد میشه. مقدار این پارامتر میتونه هر مقدار دلخواهی باشه فقط باید دقت کنین که از درج فرمت .png پرهیز کنین و نامی که برای فایل خروجی انتخاب میکنین از قبل در سرور یا هاستتون موجود نباشه. اگر ایده ای برای نام فایل خروجی نداشتین میتونین مقدار این پارامتر رو دقیقاً برابر با random قرار بدین تا PHP یک نام تصادفی 8 کاراکتری شامل اعداد و حروف برای شما ایجاد کنه و در خروجی نمایش بده.
پارامتر data هم اطلاعاتی که قصد داریم در تصویر پنهان نگاری کنیم رو مشخص میکنه. مقدار این پارامتر میتونه یک رشته متنی باشه.
نکته مـهم: شما نمیتونین هر رشته ای رو داخل هر تصویری تزریق کنین. یعنی باید تعداد بیت های اطلاعاتی که قصد دارین پنهان نگاری کنین (در واقع تعداد بیت های رشته تون) کوچکتر مساوی حاصلضرب ابعاد تصویر باشه. شاید بپرسین که چرا اینطور هست. اگر یادتون باشه در بخش اول توضیحاتم گفتم که تعداد پیکسل های هر تصویر برابره با حاصلضرب ابعاد تصویر. فرض کنین یک تصویر 50×20 دارین. تصویر شما متشکل از 1000 پیکسل هست. حالا شما قصد دارین یک رشته 2000 بیتی رو پنهان نگاری کنین. خُب از نظر منطقی وقتی نهایتاً 1000 پیکسل وجود داره چطور هر بیت از 2000 بیت اطلاعاتی که داریم در هر یک از 1000 پیسکل میتونه تزریق بشه؟ کاملاً واضحه که چنین چیزی از نظر منطقی ممکن نیست. پس برای حل چنین مشکلی باید تصویری با ابعاد بزرگتر در نظر بگیرین. لازم نیست نگران این موضوع باشین چرا که برنامه PHP که نوشتم به صورت خودکار همه این موارد رو محاسبه میکنه و اگر تعداد بیت های پیام با حاصلضرب ابعاد تصویر (تعداد پیکسل ها) متناسب نبود پیغام های مربوطه رو به شما نمایش میده.
در حاشیه: اگر مایل هستین که تصویر JPG که قصد دارین باهاش پنهان نگاری کنین رو حذف کنین میتونین پارامتر delete رو هم به ریکوئست اضافه کنین. اگر مقدار این پارامتر رو دقیقاً برابر با yes قرار بدین تصویر JPG که قصد دارین باهاش پنهان نگاری کنین از هاست یا سرورتون حذف میشه. با این توضیحات فرمت کلی ریکوئست شما در صورتی که بخواین از این پارامتر استفاده کنین به این شکل میشه:
کد:
"image=" &"sample.jpg" & "&decryption_key=" & "random/anything_else" & "&output_image=" & "random/anything_else" & "&data=" & "yourdata!" & "&delete=" & "yes"
- * بعد از انجام موفقیت آمیز پروسه استگانوگرافی اطلاعات موردنظر در تصویر پیغام زیر که بیانگر موفق بودن حذف شدن تصویر JPG اولیه هست نمایش داده میشه:
کد:
The file 'sample.jpg ' was deleted as you wished."
- * در صورتی که مقداری برای پارامتر image تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter an image for steganography proccess.
- * در صورتی که مقداری برای پارامتر data تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter some data for steganography proccess.
- * در صورتی که مقداری برای پارامتر decryption_key تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter a decryption key for steganography proccess.
- * در صورتی که مقداری برای پارامتر output_image تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter the name of the output image.
- * در صورتی که تصویر تعریف شده برای پارامتر image در هاست یا سرور موجود نباشد پیغام زیر نمایش داده می شود:
کد:
The entered image can not be found.
- * در صورتی که کلید تعیین شده برای پارامتر decryption_key شامل دست کم 20 کاراکتر، حروف کوچک، حروف بزرگ و کاراکترهای خاص نباشد پیغام زیر نمایش داده می شود:
کد:
The key should be at least 20 characters in length and should include at least one upper case letter, one number, and one special character.
- * در صورتی که تصویر تعریف شده برای پارامتر output_image از قبل موجود باشد پیغام زیر نمایش داده می شود:
کد:
The output image is already avilable before!
- * در صورتی که تعداد بیت های مقدار تعیین شده برای پارامتر data متناسب با تعداد پیکسل های تصویر نباشد پیغام زیر نمایش داده می شود:
کد:
Message too long. You should choose a photo with higher dimensions.
You can store (x) bits in this picture but you are trying to store (y) bits.
- * پیغام زیر پس از نمایش تمامی ارورها که بیانگر تعداد کل ارورهای یافت شده است نمایش داده می شود:
کد:
Number of total Errors that were found is: (a)
- * در صورتی که در پایان همه چیز به خوبی پیش برود پیغام های زیر که حاکی از موفقیت بودن پروسه پنهان نگاری است نمایش داده می شود:
کد:
The steganography proccess done successfully! All the entered data was saved in ' X .png '.
Y bits is hidden now in the output image.
About M percent(s) of the photo capcity was/were used.
Your decryption key is: C
You should be careful about storing your decryption key in a safe way.
درصد اشغال پیکسل های تصویر:
در واقع این مشخصه از طریق یک نسبت و تناسب ساده محاسبه میشه. اگر بخوایم یک تابع ریاضی برای این مشخصه تعریف کنیم میتونیم بگیم:
کد:
(تعداد بیت های اطلاعات پنهان شده × 100)÷(حاصلضرب ابعاد تصاویر)
فایل decrypt.php :
این فایل قادره اطلاعاتی که در تصاویر خروجی با فرمت PNG پنهان نگاری کردیم رو استخراج کنه. بعد از اجرای موفقیت آمیز این کد مقدار رمزنگاری شده اطلاعات ذخیره شده و مقدار رمزگشایی شده اطلاعات ذخیره شده در صورت وارد کردن کلید رمزگشایی که از فایل encrypt.php به دست آوردیم نمایش داده میشه. پروسه ای که در این فایل انجام میشه نسبت به پروسه ای که در فایل اول انجام میشد به مراتب ساده تره. در این فایل تنها خوانش مقادیر LSB پیکسل های تصویر صورت میگیره اما در فایل encrypt.php مقادیر باینری به مقادیر LSB هر پیکسل اضافه میشه.
(دقت کنین که فایل PHP رو در دایرکتوری یا مسیری ذخیره کنین که تصاویر موردنظرتون جهت استخراج اطلاعات پنهان نگاری شده وجود داره.)
کد:
<?php
/**
* @author Master Badfar
* @copyright 2020
*/
// صدور مجوز ajax برای مرورگر
header('Access-Control-Allow-Origin: *');
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors', 0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// تعریف متغیر میزان ارور
$error = 0;
// فانکشن تبدیل متن عادی به باینری
function toBin($str){
$str = (string)$str;
$l = strlen($str);
$result = '';
while($l--){
$result = str_pad(decbin(ord($str[$l])),8,"0",STR_PAD_LEFT).$result;
}
return $result;
}
// تبدیل باینری به متن
function toString($str) {
$text_array = explode("\r\n", chunk_split($str, 8));
$newstring = '';
for ($n = 0; $n < count($text_array) - 1; $n++) {
$newstring .= chr(base_convert($text_array[$n], 2, 10));
}
return $newstring;
}
// بررسی پارامترهای وارده توسط کاربر
if (empty($_POST['image'])){
$error++;
echo "You should enter the name of the image." . '</br>';
}
if(empty($_POST['decryption_key'])){
$error++;
echo "You should enter the decryption key." . '</br>';
}
// بررسی موجود بودن تصویر وارده توسط کاربر
if (!file_exists($_POST['image'] . ".png") && !empty($_POST['image'])){
$error++;
echo "The ' " . $_POST['image'] . ".png" . " ' is not avialable." . '</br>';
}
// نمایش کل ارورها
if ($error > 0){
echo "Number of total Errors that were found is: " . $error;
}
// انجام پروسه بازگردانی اطلاعات پنهان نگاری شده
if ($error == 0){
$src = $_POST['image'] . ".png"; // انتخاب تصویر
$img = imagecreatefrompng($src); // ساختن یک پلت برای پردازش
$real_message = ''; // تعریف متغیر پیام ذخیره شده
$count = 0; // برای چک کردن رسیدن به علامت انتهای پیام «|» تعریف شده
$pixelX = 0; // مقادیر پایه ای پیکسل ها
$pixelY = 0;
list($width, $height, $type, $attr) = getimagesize($src); // دریافت ابعاد تصویر
$dimension = $width * $height; // ذخیره ابعاد در یک متغیر
for ($x = 0; $x < ($width*$height); $x++) { // خواندن پیکسل به پیکسل تصویر
if($pixelX === $width+1){ // اگر یک ردیف پیکسل تمام شد، سراغ ردیف بعدی برو
$pixelY++;
$pixelX=0;
}
if($pixelY===$height && $pixelX===$width){ // بررسی اتمام خوانش پیکسل ها
echo('Max Reached');
die();
}
$rgb = imagecolorat($img,$pixelX,$pixelY); // دریافت رنگ پیکسل ها
$r = ($rgb >>16) & 0xFF;
$g = ($rgb >>8) & 0xFF;
$b = $rgb & 0xFF;
$blue = toBin($b); // تبدیل آبی به باینری
$real_message .= $blue[strlen($blue) - 1]; // اضافه کردن LSB به نتیجه
$count++;
if ($count == 8) {
if (toString(substr($real_message, -8)) === '|') {
$bin = strlen(substr($real_message,0,-8)); // ذخیره تعداد بیت های مقدار باینری استخراج شده
$real_message = toString(substr($real_message,0,-8)); // تبدیل مقدار باینری استخراج شده به رشته متنی
// رمزگشایی اطلاعات ذخیره شده در تصویر
// تنظیم پارامترهای متد رمزنگاری openssl
$ciphering = "AES-128-CTR";
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;
//تنظیم پارامتر iv
$decryption_iv = '1234567891011121';
// رمزگشایی عبارت دلخواه
$decrypted = openssl_decrypt ($real_message, $ciphering,
$_POST['decryption_key'], $options, $decryption_iv);
echo "The encrypted hidden messege is : " .'</br>'. $real_message . '</br>';
echo "The data that was saved in ' " . $_POST['image'] . ".png" . " ' is : " . '</br>'. $decrypted . '</br>';
echo $bin + 8 . " " . " bits is hidden in this picture." . '</br>';
if(!empty($_POST['delete']) && $_POST['delete'] == "yes"){
unlink($_POST['image'] . ".png");
echo "The photo ' " . $_POST['image'] . ".png" . " ' was deleted as you wished." . '</br>';
}
if (ceil($bin * 100 / $dimension) == 1){
echo "About" . " " . ceil($bin * 100 / $dimension) . " percent of the photo capacity was occupied.";
}elseif(ceil($bin * 100 / $dimension) > 1){
echo "About" . " " . ceil($bin * 100 / $dimension) . " percents of the photo capacity were occupied.";
}
die;
}
$count = 0; // ریست کردن شمارنده
}
$pixelX++; // تغییر مقدار مختصات X پیکسل ها
}
}
?>
کد:
http://yourhost.com/file.php
کد:
"image=" &"u"& "&decryption_key=" & "yourkey"
در حاشیه: اگر مایل هستین که تصویر PNG پنهان نگاری شده رو حذف کنین میتونین پارامتر delete رو هم به ریکوئست اضافه کنین. اگر مقدار این پارامتر رو دقیقاً برابر با yes قرار بدین تصویر PNG که پنهان نگاری کردین و در پارامتر image تعیین کردین از هاست یا سرورتون حذف میشه. با این توضیحات فرمت کلی ریکوئست شما در صورتی که بخواین از این پارامتر استفاده کنین به این شکل میشه:
کد:
"image=" &"u"& "&decryption_key=" & "yourkey" & "&delete=" & "yes"
- * بعد از انجام موفقیت آمیز پروسه استخراج اطلاعات استگانوگرافی شده پیغام زیر که بیانگر موفق بودن حذف شدن تصویر PNG شامل اطلاعات پنهان شده هست نمایش داده میشه:
کد:
The photo ' w.png ' was deleted as you wished.
ارورها و پیغام های فایل decrypt.php :
- * در صورتی که مقداری برای پارامتر image تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter the name of the image.
- * در صورتی که مقداری برای پارامتر decryption_key تعیین نشده باشد پیغام زیر نمایش داده می شود:
کد:
You should enter the decryption key.
- * در صورتی که تصویر تعریف شده برای پارامتر image در هاست یا سرور وجود نداشته باشه پیغام زیر نمایش داده می شود:
کد:
The ' x.png ' is not avialable.
- * پیغام زیر پس از نمایش تمامی ارورها که بیانگر تعداد کل ارورهای یافت شده است نمایش داده می شود:
کد:
Number of total Errors that were found is: (a)
- * در صورتی که در پایان همه چیز به خوبی پیش برود پیغام های زیر که حاکی از موفقیت بودن پروسه استخراج اطلاعات پنهان نگاری شده است نمایش داده می شود:
کد:
The encrypted hidden messege is :
(G)
The data that was saved in ' K.png ' is :
(B)
(Y) bits is hidden in this picture.
About (J) percent(s) of the photo capacity were/was occupied.
دقیقاً چطور اطلاعات موردنظر در فایل تصویری پنهان نگاری می شوند؟
همونطور که آگاه هستیم و بیان شد هر تصویر متشکل از چندین پیکسل هست که تعداد پیکسل های یک تصویر دلخواه از حاصلضرب ابعاد تصویر به دست میاد. هر پیکسل با سه مقدار باینری مشخص میشه. یک یا چند بیت برای رنگ سبز (Green)، یک یا چند بیت برای رنگ قرمز (Red) و یک یا چند بیت برای رنگ مشکی (Black) به کار میره. در واقع در دنیای رایانه رنگ هر پیکسل رو با شاخصی به نام RGB تعیین میکنن. یعنی به بیان دیگه مبنای رنگ ها در دنیای رایانه سه رنگ سبز، قرمز و مشکی هستن. هر یک از این سه رنگ (کامپوننت ها) برای هر پیکسل همونطور که گفته شد با سه مقدار باینری مشخص میشن. تلفیق مقادیر باینری R،G و B هر پیکسل در واقع رنگ نهایی اون پیکسل رو مشخص میکنه.
فرض کنین یک پیکسل از تصویر مقادیر باینری R، G و B به این شکل داشته باشه:
قرمز (Red) :
11001001
سبز (Green) :
11111000
آبی (Blue) :
00000011
تلفیق این سه مقدار باینری باعث میشه که رنگ پیکسل نارنجی بشه.11001001
سبز (Green) :
11111000
آبی (Blue) :
00000011
برگردیم به استگانوگرافی یا پنهان نگاری خودمون. همونطور که گفتم ما در پنهان نگاری در بیت های LSB تغییر ایجاد میکنیم. این تغییرات که توسط ما ایجاد میشن مسلماً باعث تغییر رنگ تصویر خروجی میشن اما این تغییر رنگ اونقدر کوچیکه که با چشم انسان قابل فهم نیست.
فرض کنین من میخوام پیام 4 بیتی (1101) رو در یک تصویر پنهان نگاری کنم. من قصد دارم تنها مشخصه B (آبی) پیکسل های تصویر رو تغییر بدم. پس طبیعتاً برای ذخیره کردن 4 بیت پیامی که دارم تصویر من باید دست کم حاوی 4 پیکسل باشه. با این حساب من باید پیامم رو در بین چهار پیکسل توزیع کنم.
حالا مقدار RGB چهار پیکسل دلخواه از تصویر رو دریافت میکنم. فرض کنین مقادیر RGB چهار پیکسل دلخواهی که انتخاب کردم به این شکل باشه:
Pixel 1 : 11001100 , 10010001 , 00101011
Pixel 2 : 00011000 , 11110000 , 11111110
Pixel 3 : 11100010 , 00100101 , 01010101
Pixel 4 : 11111101 , 00001010 , 01000011
همونطور که می بینین بین مقادیر باینری سه کامپوننت RGB با علامت کاما (,) نوعی فاصله قرار دادم. یعنی برای مثال در پیکسل اول مقدار باینری (11001100) بیانگر R، مقدار باینری (10010001) بیانگر G و مقدار باینری (00101011) بیانگر B هست. حالا برای پنهان نگاری پیام 4 بیتی خودم (1101) آخرین بیت هر پیکسل رو که همون بیت LSB و بیت مربوط به کامپوننت B هست رو تغییر میدم. پس چهار پیکسلی که انتخاب کردم بعد از تزریق اطلاعات به این شکل میشن:Pixel 1 : 11001100 , 10010001 , 00101011
Pixel 2 : 00011000 , 11110000 , 11111111
Pixel 3 : 11100010 , 00100101 , 01010100
Pixel 4 : 11111101 , 00001010 , 01000011
بیت هایی که با رنگ نارنجی مشخص شدن در واقع همون بیت های پیام ما هستن که در هر پیکسل به صورت مساوی توزیع شدن. حالا مقدار باینری RGB جدید هر پیکسل رو مجدداً تعریف میکنیم. همونطور که گفتم با دست کاری مقادیر باینری RGB هر پیکسل تغییر رنگ اتفاق میفته اما چشم انسان قادر به تشخیص این تغییر رنگ نیست.کاربردها و امنیت روش LSB برای پنهان نگاری اطلاعات در تصاویر:
این روش میتونه کاربردهای مختلفی از انتقال پیغام های سری بدون مشکوک شدن تا ذخیره سازی اطلاعات و هر کاربرد دیگه ای که مدنظر شما هست رو داشته باشه. این روش میتونه تا حد خوبی امنیت اطلاعات ذخیره شده رو حفظ کنه چرا که مهاجم یا مهاجمین هیچ مقدار رمزنگاری شده ای پیش روی خودشون مشاهده نمیکنن و اگر هم بتونن به پروسه ای که ما انجام دادیم پی ببرن باید از کلید رمزگشایی که تعیین کردیم برای رمزگشایی عبارت پنهان نگاری شده در تصویر استفاده کنن که با توجه به ایمن بودن روش رمزنگاری AES کرک سایفرها (Ciphers) با روش های بروت فورس (Brute-Force) و وردلیست برای یک رایانه خانگی سالها زمان میبره.
اگر من به شخصه قصد داشتم این روش رو به کار ببندم از اون به منظور ذخیره سازی کلید رمزگشایی اطلاعات ذخیره شده از کاربرانم در دیتابیس استفاده میکردم. یعنی برای اطلاعات هر کاربر در دیتابیس خودم یک کلید رمزگشایی منحصر به فرد تعریف میکردم و اون کلید رو به عنوان مثال در تصویر پروفایل کاربر به صورت رمزنگاری شده پنهان نگاری میکردم.
امیدوارم از این مطلب لذت برده باشین.
خوشحال میشم که نظراتتون رو به حقیر گوشزد کنین و اگر جایی مشکل یا بدفهمی وجود داشت حتماً اعلام کنین.
برای نوشتن کدهای این مطلب و توضیحات اون زمان زیادی صرف شده که امیدوارم باعث پربار شدن مطلب شده باشه.
با آرزوی بهترین ها...