الأحد، 17 مارس 2013

إخفاء نص داخل صورة (Hide Text in Image By Matlab)

بكل طرق التشفير يبقى هناك نص للبيانات عندما تعترض من قبل العدو يشكك في كونها رسالة مشفرة ويحاول ان يفكها بكل طرق التشفير فمثلا طرق تشفير التي نعرفها مشهورة حاليا يعرفها الجميع ومثلما نستطيع ان نشفر نص بها  يستطيع العدو ان يحاول فك النص بها .حتى طرق تشفير جديدة التي نحن نبنيها لا يعرفها غيرنا يبقى العدو يحاول فكها. الذي نريده نحن ان معترض الرسالة (العدو) لا يشك اصلا بوجود رسالة مشفرة لأننا سنخفيها داخل صورة فلا يفكر اصلا بوجود نص مشفر او نخفيها بصورة بين 100 صورة مرسلة فيصعب على المعترض إيجادها ومن ثم فكها.
هناك طرق عديدة لإخفاء نص داخل صورة معينة وأفضلها وضع النص في LSB لكل Gray Scale حيث يمثل هذا البت رقم واحد فقط مثلا اذا كان في Gray Scale معين رقم زوجي يكون LSB صفر واذا فردي يكون واحد أي إننا اذا غيرنا هذا البت بواسطة اخفاء بيانات في داخله  أي تغير في قيمته لا يؤثر على الصورة كثيرا فهو يغير الأضائه بمقدار واحد فقط من اصل 255 أي لا يسبب بأثر واضح يجعل الشخص يشك بوجود نص مشفر داخل الصورة أي مثلا لو كان Gray Scale لموقع معين (161) لو خزنا  في LSB له قيمة (0 ) يصبح  Gray Scaleلهذا الموقع يساوي 160 ولو خزنا فيه (1) يبقى (161 )

خطوات الإخفاء على صورة عادية gray
1.    نقرئ الصورة  الملونة وثم نحولها الى عادية وبعدها نجد ابعاد المصفوفة وتساعدنا ابعاد المصفوفة على اعادة الصورة الى شكلها الاصلي بعد خزن النص في داخلها
Matlab Code 2d gray image
x=imread('C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg');
imageDCE=rgb2gray(x);
 [r c]=size( imageDCE);



2.    نحول الصورة الى النظام الثنائي(Binary)  حتى نستطيع ان نغير البت الثامن الايمن LSB

Matlab Code 2d gray image
imageBIN=dec2bin( imageDCE);


3.    ندخل النص المرد إخفائه ونحوله الى AScii Code ومنه الى النظام الثنائي ونجد عدد الصفوف وعدد الأعمدة له حتى نستطيع ان ننقل بايتات كل حرف الى داخل البتLSB في الصورة حيث كل بايت من بايتات الحرف سيخزن في البنت الثامن الأيسر لموقع معين في الصورة

Matlab Code 2d gray image
text='hi';
ascm=double(text);
binasc=dec2bin(ascm);
[rt, ct]=size(binasc);
 

4.    ألان نخزن كل بت من البتات السبعة من  كل حرف داخل صف من صفوف الصورة في العمود الثامن الذي يمثل LSB ثم ننتقل للبت المقابل في الكلمة الثانية ونستمر حتى اخر حرف ثم نرجع لثاني بت بأول كلمة ثم ثاني بت بثاني كلمة ونستمر. أي كلما ازداد حجم النص ازدادت صعوبة فك شفرة شاهد الصورة  لا يعرف المعترض ماهي بنات الصورة وما هي بتات النص
Matlab Code 2d gray image
for i=1:1:rt*ct
 imageBIN(i,8) =binasc(i);  
 end

بواسطة i نحدد من أي موقع داخل الصورة نبدأ بعملية الإخفاء








5.    ألان أخفينا النص داخل الصورة ألان نحول الصورة من النظام الثنائي الى النظام العشري ونعيد ابعاد المصفوفة الى أبعادها الاولية باستخدام داخلة reshape  ونشاهد ان الصورة تحولت بصيغية رقم واحد نستخدم دالة   uint8 لنعيدها الى صيغة رقم عشري بثمانية بت
Matlab Code 2d gray image
ENCimageDCE=uint8(reshape(bin2dec(imageBIN),r,c ));
6.    نقوم برسم الصورة قبل وبعد خزن النص في داخلها

Matlab Code 2d gray image
subplot(1,2,1)
 imshow(imageDCE)
 subplot(1,2,2)
 imshow(ENCimageDCE)



 


اعادة النص المشفر من الصورة
1.    نحول الصورة التي اخفينا النص في داخله  الى صيغة النظام الثنائي
Matlab Code 2d gray image
  decriptext=dec2bin(ENCimageDCE);
2.    ناخذ البت الثامن من كل صف ونخزنه في مصفوفة جديدة ونلاحظ انه يجب ان يرسل لنا صاحب الرسالة المشفرة عدد صفوف وعدد اعمدة النص المشفر ومن اين يبدأ التشفير داخل الصورة حتى نستطيع أخراجه .   في هذه الحالة يجب ان نقول للمستلم الصورة توضيح عن النص المرسل وهو نقول له عدد الاحرف rt وعدد Bit لكل حرف  ct   حتى نستطيع ارجاع النص من داخل الصورة (مثلا النص الخزن داخل الصورة هوا 17 حرف كل   حرف من 8 بت اي rt=17,ct=8 )  
Matlab Code 2d gray image

 textbin=decriptext(1:rt*ct,8);
3.    نعيد تحجيم المصفوفة النص الى شكلها الأولي بصيغة النظام الثنائي ونحولها من النظام الثنائي الى النظام العشري .
Matlab Code 2d gray image
ascimessage=bin2dec(reshape(textbin ,rt,ct ) );
4.    نحول البيانات من العشري الى الحروف ونضع علامة (‘) لكي تعرض بشكل صفوف


Matlab Code 2d gray image
 messageDEc= char(ascimessage)' 


 

كود برنامج الإخفاء وإعادة النصوص كامل لصورة عادية
Matlab Code 2d gray image
clc
 clear
x=imread('C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg');
text='bad friend maked you bad';
ascm=double(text);
binasc=dec2bin(ascm);
[rt, ct]=size(binasc);
%we use 2D image tospeed op.
 imageDCE=rgb2gray(x);
 %we use one line to relase line of code
 %imageDCE=imageDCE(1:4,1:4);
 %saved old shap it convert to one line
 [r c]=size( imageDCE);
 % convert image to binary
imageBIN=dec2bin( imageDCE); % cover it to one col 8bit and  row=r*c

% imageBIN(:,8)=0; % put zero in all LSB in image
 for i=1:1:rt*ct
 imageBIN(i,8) =binasc(i);  
 end
 %imageBIN(:,8)=binasc(1:end)
 % UINT8 Convert to unsigned 8-bit integer. becuse it convert to one bit
 ENCimageDCE=uint8(reshape(bin2dec(imageBIN),r,c ));
% ENCimageDCE(1:rt*ct)=0; to show area of hide
 subplot(1,2,1)
 imshow(imageDCE)
 subplot(1,2,2)
 imshow(ENCimageDCE)
% figure
 %imageBIN(1:rt*ct,:)=0;
 % ENCimageDCE=uint8(reshape(bin2dec(imageBIN),r,c ));
 %imshow(ENCimageDCE)
 % to sure of encrption binasc(1:8),imageBIN(1:8,8) show that who image is
 % encripted
 decriptext=dec2bin(ENCimageDCE);
 textbin=decriptext(1:rt*ct,8);
 ascimessage=bin2dec(reshape(textbin ,rt,ct ) );
 messageDEc= char(ascimessage)'
كود برنامج الإخفاء وإعادة النصوص كامل لصورة  ملونة

Matlab Code 3d rgb
clc
 clear
x=imread('C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg');
text='hi';
ascm=double(text);
binasc=dec2bin(ascm);
[rt, ct]=size(binasc);
%we use 2D image tospeed op.
 %imageDCE=rgb2gray(x);

 %we use one line to relase line of code// show who image effect by text
% imageDCE=imageDCE(1:4,1:4);
 %saved old shap it convert to one line
 %[r c]=size( imageDCE);
  %if we use 3D image--------------
   [r c f]=size( x);
   imageBIN=dec2bin( x);
   %------------------------
 % convert image to binary
%imageBIN=dec2bin( imageDCE); % cover it to one col 8bit and  row=r*c

% imageBIN(:,8)=0; % put zero in all LSB in image
 for i=1:1:rt*ct
 imageBIN(i,8) =binasc(i);  
 end
 %imageBIN(:,8)=binasc(1:end)
 % UINT8 Convert to unsigned 8-bit integer. becuse it convert to one bit
 ENCimageDCE=uint8(reshape(bin2dec(imageBIN),r,c,f ));
 subplot(1,2,1)
 imshow(x)
 subplot(1,2,2)
 imshow(ENCimageDCE)
% figure
 %imageBIN(1:rt*ct,:)=0;
 % ENCimageDCE=uint8(reshape(bin2dec(imageBIN),r,c ));
 %imshow(ENCimageDCE)
 % to sure of encrption binasc(1:8),imageBIN(1:8,8) show that who image is
 % encripted
 decriptext=dec2bin(ENCimageDCE);
 textbin=decriptext(1:rt*ct,8);
 ascimessage=bin2dec(reshape(textbin ,rt,ct ) );
 messageDEc= char(ascimessage)'

تحميل المقالة من هنا او حمل من هنا



 

هناك 8 تعليقات:

Unknown يقول...

السلام عليكم ..شكرا على موقعكم الراائع ..لكن اريد ان اتعلم كيف ابرمج عمل ocr لتحويل الصورة الى نص وشكرا ..

Unknown يقول...

وعليكم السلام ؟؟
طريقة تحويل الصورة الى نص موجودة في الشرح
اقرئي الشرح جيدا

غير معرف يقول...

شكرا جزيلا على هذا الشرح الوافي وجزاك الله عنا خير الجزاءn

غير معرف يقول...

السلام عليكم ورحمة الله
عاشت ايدك استاذ حسين على هذا الشرح الوافي وجزاك الله عنا خير الجزاء

majed يقول...

سلام
هناك اخطاء في تنفيذ الكود
وبلاخص ام reshape
هل مستعد ان نتعاون معا في تصحيح الاخطاء
اولا من اي مصدر جلبتها

Unknown يقول...

السلام عليكم اخي ل نسخة الماتلاب التي انت تستخدمها قديمة او فيها نقص ملفات استخدم نسخة
Matlab R2010a
وسيعمل بشكل طبيعي

غير معرف يقول...

السلام عليكم
اخ حسين ماجاي يتنفذ عندي البرنامج اكو مشكله بالreshape ,كانت نسختي قديمه2008 والان نصبت 2013 ونفس المشكله ياريت تساعدني اني طالبة ماجستير قسم هندسة الاتصالات بالجامعه التكنلوجيه وموضوع بحثي عن stegnography وماعندي اي خلفيه عن image processing

غير معرف يقول...

السلام عليكم
اخ حسين ماجاي يتنفذ عندي البرنامج اكو مشكله بالreshape ,كانت نسختي قديمه2008 والان نصبت 2013 ونفس المشكله ياريت تساعدني اني طالبة ماجستير قسم هندسة الاتصالات بالجامعه التكنلوجيه وموضوع بحثي عن stegnography وماعندي اي خلفيه عن image processing