بخشی از مقاله
چکیده :
در دنیاي حقیقی و مجازي امروز، هیچ گاه همه چیز آن طور که به نظر می آید نیست. این مسئله در زندگی روزمره ما بارها و بارها اتفاق می افتد. به عنوان مثال تصویري را در نظر بگیرید که در نگاه اول توجه شما را به خود جلب نمی کند درحالی که این تصویر در بطن خود حاوي اطلاعات محرمانه اي است. موضوعی با عنوان پنهان سازي متن درون یک تصویر از سالیان دور در علم برنامه نویسی و پردازش تصویر وجود داشته است. در این مقاله روشی ارائه شده است که قادر است متنی را با توجه به تعداد پیکسل هاي تصویر اصلی به گونه اي درون آن پنهان سازد که تغییر محسوسی در تصویر اصلی رخ نمی دهد. این روش شامل دو الگوریتم اصلی است که الگوریتم اول را فرستنده اجرا می کند و کار اصلی آن مخفی سازي متن درون تصویر است و گیرنده می تواند با اجراي الگوریتم دوم متن پنهان شده در تصویر را استخراج کند.
کلید واژه: برنامه نویسی، پردازش تصویر، الگوریتم، پیکسل
-1 مقدمه
موضوعی با عنوان پنهان سازي متن درون یک تصویر از سالیان دور در علم برنامه نویسی و پردازش تصویر وجود داشته است. Steganography، هنر مخفی کردن یک متن در متن دیگر، یکی از هم خانواده هاي Cryptography یا رمزنگاري است که امروزه بدلیل در خواست صنعت در به جا گذاشتن آثاري در فیلم هاي ویدئویی و صدا براي اعمال copyright استفاده فراوانی پیدا کرده است. هدف steganography این است که پیغامی را در یک پیغام دیگر به روشی ذخیره کند که دشمن پی به وجود پیغام اول در پیغام دوم نبرد. اولین استفاده هاي steganography توسط Herodotus یک مورخ یونانی به ثبت رسیده و ماجراي آن به یونان باستان باز می گردد. وقتی حاکم یونان Histiaeus به دست داریوش در شوش در قرن پنجم پیش از میلاد زندانی شده بود می بایست پیغامی مخفیانه به برادر خوانده اش در Miletus بفرستد. براي همین منظور موي سر غلامش را تراشید و پیغامی را روي فرق سرش خال کوبی کرد وقتی موهاي غلام به اندازه کافی رشد کرد او را عازم مقصد کرد.[1]
وقتی نشانه تجاري یا مشخصه اي در یک اثر مانند عکس، ویدئو یا صدا به شکل مخفیانه ذخیره می شود به آن watermarking می گویند که یکی از شاخه هاي Steganography به حساب می آید. براي این هدف تاکنون
الگوریتم هاي مختلفی ارائه شده است که نمونه هاي آن در [2]،[3]و [4] بیان شده است.
روشی که در این مقاله ارائه شده است به منظور پنهان سازي متن درون تصویر به صورت بیتی است براي این منظور دو الگوریتم اصلی ارائه شده است؛ الگوریتم اول که در طرف فرستنده اجرا می شود و متن را درون تصویر مخفی می کند، الگوریتم دوم که در طرف گیرنده بر روي تصویر دریافتی اجرا شده و اطلاعات موجود در آن را استخراج می کند. در الگوریتم فرستنده باید ابتدا کاراکترهاي موجود در متن را به شکل باینري آن تبدیل کرده و سپس بیت هاي موجود در هر کاراکتر را در کم ارزش ترین بیت پیکسل هاي موجود در تصویر قرار دهیم. مکان اولین پیکسل بستگی به کمترین و بیشترین مقدار شدت پیکسل هاي موجود در تصویر دارد. بعد از تعیین مکان اولیه، بیت هاي مربوط به کاراکترها پشت سرهم درون کم ارزش ترین بیت موجود در پیکسل ها (با توجه به مکان اولیه) قرار می گیرد و این فرایند تا آخرین بیت از آخرین کاراکتر ادامه می یابد.
در ادامه طرح اولیه الگوریتم با فرض داشتن تصویري با mn پیکسل و رشته اي از حروف که همان متن مورد نظر ما را تشکیل می دهد و پس از آن الگوریتم هاي مربوط به طرف فرستنده و طرف گیرنده با جزئیات کامل بیان می شود و سپس نتایج حاصل از پیاده سازي الگوریتم بررسی خواهد شد.
1
چهاردهمین کنفرانس دانشجویی مهندسی برق ایران دانشگاه صنعتی کرمانشاه، 17 -15 شهریور 1390
-2 طرح اولیه
در ابتدا فرض کنید تصویري با سایز mn موجود است. می خواهیم متنی را با تعداد مشخصی کاراکتر درون این عکس مخفی کنیم، براي این منظور کاراکترهاي موجود در متن را به شکل باینري آن تبدیل کرده در نتیجه به ازاي هر کاراکتر تعداد مشخصی 6) یا (7 بیت خواهیم داشت. با توجه به روش بیتی براي قرار دادن هر بیت از کاراکتر درون یک پیکسل باید ابتدا مکان اولین پیکسل را تعیین کرد. براي این منظور سطر و ستون L را به عنوان مکان اولین بیت از اولین کاراکتر انتخاب می کنیم که L به شکل زیر بیان می شود:
(1) /2] L [
(k r)
در معادله بالا k برابر است با حداکثر مقدار شدت پیکسل
هاي موجود در تصویر و r برابر است با حداقل مقدار شدت پیکسل هاي موجود در تصویر. پس از آن بیت دوم از کاراکتر اول در خانه (L,L+1) قرار می گیرد و این عمل تا پایان قرار دادن همه بیت هاي متن موجود ادامه می یابد. چنانچه در موقعیتی قرار گرفتیم که می بایست بیت بعدي در مکانی بعد از مکان (L,n) قرار بگیرد آنگاه یکی به سطر اضافه می کنیم و ستون را 1 قرار می دهیم یعنی بیت مورد نظر باید در کم ارزش ترین بیت پیکسل (L+1,1) قرار گیرد.
از آنجایی که تصویر اولیه پس از رمزگذاري متن در آن باید براي گیرنده ارسال شود، گیرنده باید بتواند مکان اولین بیت را تشخیص دهد. درنتیجه، مکان اولین بیت را در جایی از تصویر به صورت رمز شده نگه می داریم تا گیرنده بتواند آن را به راحتی پیدا کند. بدین منظور براساس فرمول زیر یکی از 3 سطر انتهایی، براي قرار دادن اطلاعات مربوط به متن (سطر و ستون اولین و آخرین بیت) انتخاب می شود.
(2) p n ([mn]%3)
در رابطه بالا m برابر است با تعداد پیکسل هاي موجود در
طول تصویر و n برابر با تعداد پیکسل هاي موجود در عرض تصویر است.
بعد از آنکه تمام بیت هاي مربوط به متن در پیکسل هاي تصویر قرار گرفت باید سطر و ستون آخرین بیت را در همان سطري که جهت ذخیره سازي اطلاعات مربوط به متن رزرو شده است قرار داد. البته باید توجه داشت که این اطلاعات بعد از اطلاعات مربوط به سطر اولین بیت قرار می گیرد.
در طرف گیرنده پس از دریافت تصویر ابتدا باید با توجه به فرمول 2 اطلاعات مربوط به متن یعنی سطر و ستون اولین بیت
æ سطر و ستون آخرین بیت استخراج شود. پس از آن با توجه به اطلاعات مربوط به مکان بیت اول از کاراکتر اول و با توجه به کم ارزش ترین بیت پیکسل که همان مقدار بیت مورد نظر است اطلاعات از تصویر استخراج می شود. در ادامه الگوریتم فرستنده
æ گیرنده با جزئیات کامل بیان می شود.
1-2 الگوریتم فرستنده:
الگوریتم اصلی که در طرف فرستنده اعمال می شود encode_bit نام دارد که خود شامل دو تابع کمکی است. مطابق آنچه که در طرح اولیه بیان شد، الگوریتم اصلی یک تصویر را به عنوان پارامتر ورودي دریافت می کند. پس از آن رشته اي که متن مورد نظر را جهت مخفی سازي در تصویر دربردارد با نام str1 باید درون تصویر رمزنگاري شود و در طرف گیرنده از تصویر استخراج گردد. براي این منظور کاراکترهاي رشته str1 را با استفاده از تابع uint8 به عدد دهدهی معادل تبدیل کردیم. پس از آن با استفاده از تابع size(img) اندازه سطر و ستون تصویر استخراج می شود و درون متغیرهایی قرار می گیرد. در مرحله بعد مطابق فرمول 2 یکی از سه سطر انتهایی به منظور رزروسازي براي اطلاعات مربوط به تصویر انتخاب شد و مکان اولیه را براي ذخیره سازي اولین بیت مشخص کردیم. در این الگوریتم دو تابع کمکی نیز تعریف شد که در ادامه بیان می شود.
اولین تابع کمکی که در الگوریتم فرستنده تعریف شد، تابع str2bin بود که کار اصلی این تابع قرار دادن رشته عددي مثلا رشته ‘15’ درون خانه اي با سطر و ستون مشخص شده از تصویر است (که در این الگوریتم همان سطر رزروشده است). براي ذخیره رشته ‘15’ ابتدا با استفاده از تابع length طول رشته که در اینجا 2 است را بدست می آوریم و عدد 2 را با استفاده از تابع int2str به رشته 2 تبدیل می کنیم و با استفاده از تابع convert_in (دومین تابع کمکی که در ادامه با جزئیات کامل بیان خواهد شد) ابتدا رشته 2 به صورت بیتی درون 6 پیکسل از تصویر قرار می گیرد. بعد از آن با استفاده از یک حلقه for که به تعداد طول رشته مورد نظر که در این مثال دو مرتبه است تکرار می شود؛ در تکرار اول عدد دهدهی معادل رقم دهگان (چون عدد دو رقمی است) و در تکرار دوم عدد دهدهی معادل رقم یکان را ذخیره می کند. خروجی این تابع یک عدد
2
چهاردهمین کنفرانس دانشجویی مهندسی برق ایران دانشگاه صنعتی کرمانشاه، 17 -15 شهریور 1390
(که ستون آخرین بیت را مشخص می کند) و تصویر تغییر یافته است.
بعد از آن می بایست با یک حلقه for که به تعداد کاراکترهاي موجود در متن اولیه تکرار می شود تمام کاراکترهاي موجود در متن اولیه (str1) را به همان روشی که در طرح اولیه بیان شد درون تصویر قرار داد. در این حلقه ابتدا کاراکترهاي متن را که حال به صورت عدد دهدهی درآمده اند به عدد باینري تبدیل می شود اما از آنجایی که برخی از این اعداد باینري، 6 بیتی و برخی دیگر 7 بیتی اند جهت سادگی، بزرگترین مقدار یعنی 7 را به عنوان تعداد بیت هاي کاراکتر در نظر می گیریم و کاراکترهایی را که 6 بیتی اند به کاراکترهاي 7 بیتی تبدیل می کنیم.
دومین تابع کمکی که در الگوریتم فرستنده استفاده شد، تابع convert-in بود که کار اصلی این تابع قرار دادن یک کاراکتر درون 7 پیکسل از خانه هاي تصویر است (باید توجه داشت که تعداد پیکسل ها جهت ذخیره سازي یک کاراکتر به عنوان پارامتر ورودي به تابع ارسال می شود). براي درك بیشتر، عملکرد تابع را با یک مثال نشان می دهیم. فرض کنید می خواهیم عدد باینري 1011001 را در یک تصویر که مکان اولین بیت آن به عنوان پارامتر ورودي به تابع ارسال شده است، قرار دهیم، براي این منظور از یک حلقه for استفاده می شود که به تعداد 7 مرتبه (تعداد بیت هاي عدد باینري) تکرار خواهد شد. براي این عمل، تابع سطر و ستون مکان بیت اول از 7 بیت یک کاراکتر و تصویر را می گیرد و خروجی آن سطر و ستون مکان هفتمین بیت و تصویر تغیر یافته است.
عمل قرار دادن یک بیت از 7 بیت در کم ارزش ترین بیت یک پیکسل بدین صورت انجام می شود: فرض کنید مقدار پیکسل (a,b) که اولین بیت باید با کم ارزش ترین بیت این مکان تعوض گردد عدد زوج است (کم ارزش ترین بیت آن صفر است) در این حالت براي قرار دادن یک عدد باینري 0) یا (1 کافی است مقدار این پیکسل با عدد باینري xor شود. در حالتی که مقدار پیکسل (a,b) عدد فرد است (کم ارزش ترین بیت آن 1 است) در این شرایط دو حالت براي بیت جایگزین داریم: حالت اول) اگر بیت جایگزین 0 باشد کافی است مقدار پیکسل را از 1 کم می کنیم که باعث می شود مقدار پیکسل زوج شود، حالت دوم) اگر بیت جایگزین 1 باشد، چون مقدار پیکسل نیز عدد فردي است نیازي به تغییر ندارد.
پس از جایگزینی بیت، براي قرار دادن بیت بعدي یک ستون به جلو حرکت کنیم. درنتیجه باید عدد ستون را با 1 جمع کنیم اما چنانچه عدد ستون برابر با طول ستون تصویر بود باید یکی به سطر اضافه و ستون برابر 1 شود. پس از پایان 7 مرتبه تکرار، مقدار سطر و ستون آخرین بیت به همراه خود تصویر برگردانده می شود.
بعد از قرار دادن همه کاراکترهاي متن درون تصویر، حلقه for پایان می یابد. در انتهاي الگوریتم نیز باید سطر و ستون مکان آخرین بیت را مشابه ذخیره سازي مکان اولین بیت، ذخیره کرد که تابع str2bin دو مرتبه فراخوانی می شود، که در مرتبه اول سطر آخرین بیت از آخرین کاراکتر را در سطر رزروشده قرار می دهد و در مرتبه دوم ستون آخرین بیت از آخرین کاراکتر را درون سطر رزرو شده قرار می دهد. در انتها باید تصویر مورد نظر که اکنون حاوي اطلاعات مربوط به متن است با فرمت bmp ذخیره کرد.
2-2 الگوریتم گیرنده
تصویر مورد نظر پس از اینکه اطلاعات مربوطه درون آن قرار گرفت قابل ارسال می باشد که در طرف گیرنده نیز باید الگوریتم دیگري جهت استخراج اطلاعات موجود در تصویر بر روي آن اعمال شود که این الگوریتم decode_bit نامیده شد که به منظور استخراج اطلاعات موجود در آن روش زیر اعمال می شود. در این الگوریتم نیز مشابه الگوریتم قبل از 2 تابع کمکی دیگر استفاده می شود. پارامتر الگوریتم اصلی تصویري است که متنی درون آن رمزگذاري شده است. براي استخراج متن مورد نظر تنها کافی است اطلاعات موجود در سطر رزرو شده استخراج شود (اطلاعات مربوط به سطر و ستون اولین بیت از اولین کاراکتر و سطر و ستون آخرین بیت از آخرین کاراکتر). پس مجداد مطابق فرمول 2 سطر رزروشده پیدا میشود.
اولین تابع کمکی طرف گیرنده تابع cntt است که هدف این تابع استخراج 3 عدد مربوط به سطر و ستون مکان اولین بیت (با توجه به اینکه اولین بیت بر روي قطر اصلی واقع شده است در نتیجه مقدار سطر و ستون آن با یکدیگر برابر است)، سطر و ستون آخرین بیت است. پارامتر هاي ورودي این تابع شماره سطري است که براي اطلاعات متن رزرو شده اند و تصویري که متن در آن پنهان شده است. براي درك بیشتر تابع را با یک مثال توضیح می دهیم: