18-04-18, 07:50 PM
(آخر تعديل لهذه المشاركة : 20-04-18, 06:18 PM {2} بواسطة silverlight.)
مقدمـــــــة
كلمة Stegnography في مجال البرمجة هي علم أو فن إخفاء المعلومات او البيانات
و في هذا الموضوع سنوضح كيفية اخفاء البيانات و لكن برؤية مختلفة فليلا
وفي النهاية الأمر كله عبارة عن وجهة نظر شخصية
الهدف من الموضوع:
1- إثراء المنتدي بمحاولة عرض موضوعات غير تقليدية وهذا قد يساعد علي جذب المزيد من القراء و الأعضاء للمنتدي
2- طرح موضوعات قد تهم المبرمج العربي في كتابة برامج أفضل
الفكرة:
لو بحثت عزيزي القارئ عن كلمة Stegnography علي النت
غالبا ستجد موضوعات تتحدث عن كيفية اخفاء تكست في صورة عادية
وهنا أنا لن أناقش Stegnography من هذا المنطلق
لأنه و ببساطة شديدة يمكن لمن يقرأ هذا الموضوع أن يقرأ ويبحث في هذا الموضوع بنفسه
لكن هنا سأطرح فكرة كيفية انشاء الصورة التي تستوعب المعلومات ومن ثم يمكن اخفاء المعلومات بها
خطوات تنفيذ الفكرة:
1- الحصول علي البيانات في صورة مصفوفة بايت
و البيانات هنا قد تكون صورة او ملف او تكست او ارقام ....الخ
2- التعامل مع تلك المصفوفة و تحويلها الي مصفوفة أخري أو يمكن اعتبارها مصفوفة ألوان او مصفوفة بايت
3- حساب أبعاد الصورة التي تستوعب مصفوفة الألوان
4- بناء الصورة التي نحفظ بها مصفوفة الألوان
تنفيذ الفكرة:
لنفترض اننا نريد إخفاء تكست في صورة
اول شئ نفعله هو تعريف متغير يغبر عن تكست
ثانيا تخويل التكست الي مصفوفة بايت
ثالثا نأتي الي اهم شئ في تنفيذ الفكرة و هو تحويل هذه المصفوفة الي مصفوفة ألوان
او تحويلها الي مصفو فة بايت بحيث كل اربعة بايت يساوي لون معين
ويمكن تنفيذ ذلك باستخدام دالة مثل هذه
وإن كنت لا تريد استخدام Yield
يمكن استخدام دالة مثل هذه
أو يمكن استخدام دالة مثل هذه لتكرار البيانات
مثال توضيحي صغير
لنفترض اننا نريد تحويل الخرف "A" الي مصفوفة بايت '
ملحوظة:
طبعا التعامل مع الحروف العربية يختلف قليلا عن التعامل مع الحروف الانجليزية
حيث أن كل حرف عربي وعند تحويله الي مصفوفة بايت فإن كل حرف يعادل 2 بايت و ليس بايت واحد كما في اللغة الانجليزية
ما يجب أن نفعله هو ان نحول مصفوفة البايت للحرف "A" لتكون كالتالي
أي اننا و ببساطة شديدة ناخذ قيمة اي بايت و نضاعفها اربعة مرات
او يمكن ان نجعلها كالتالي
هذه الخطوة من الكود يجب الاهتمام بها جدا لأنها الاساس لإسترجاع البيانات الأصلية لاحقا
ومنها أيضا سوف نحسب أبعاد الصورة التي نحتاجها لحفظ المعلومات بداخلها
أخيرا حساب أبعاد الصورة
يتم حساب أبعاد الصورة من المعادلة التالية
bytes length = ( Width in pixels × height in pixels × colour depth ) /8
حيث أن
width = عرض الصورة
height = طول الصورة
image pixel format = pixel format
نصيحة يجب تثبيت قيمةالبكسل فورمات و اجعل هذه القيمة تساوي 32 دائما
يجب ان نضع في اعتبارنا ان اكبر Length لمصفوفة الألوان يجب ان لا يتعدي القيمة (2^32 = 4294967296)
الأن لنكتب الكود كاملا
انشاء الصورة و حفظها
يمكن استخدام الدالة التالية لتحويل مصفوفة بايت الي صورة
الكود كاملا
أتمني أن الموضوع يكون مفيدا للبعض منكم
كلمة Stegnography في مجال البرمجة هي علم أو فن إخفاء المعلومات او البيانات
و في هذا الموضوع سنوضح كيفية اخفاء البيانات و لكن برؤية مختلفة فليلا
وفي النهاية الأمر كله عبارة عن وجهة نظر شخصية
الهدف من الموضوع:
1- إثراء المنتدي بمحاولة عرض موضوعات غير تقليدية وهذا قد يساعد علي جذب المزيد من القراء و الأعضاء للمنتدي
2- طرح موضوعات قد تهم المبرمج العربي في كتابة برامج أفضل
الفكرة:
لو بحثت عزيزي القارئ عن كلمة Stegnography علي النت
غالبا ستجد موضوعات تتحدث عن كيفية اخفاء تكست في صورة عادية
وهنا أنا لن أناقش Stegnography من هذا المنطلق
لأنه و ببساطة شديدة يمكن لمن يقرأ هذا الموضوع أن يقرأ ويبحث في هذا الموضوع بنفسه
لكن هنا سأطرح فكرة كيفية انشاء الصورة التي تستوعب المعلومات ومن ثم يمكن اخفاء المعلومات بها
خطوات تنفيذ الفكرة:
1- الحصول علي البيانات في صورة مصفوفة بايت
و البيانات هنا قد تكون صورة او ملف او تكست او ارقام ....الخ
2- التعامل مع تلك المصفوفة و تحويلها الي مصفوفة أخري أو يمكن اعتبارها مصفوفة ألوان او مصفوفة بايت
3- حساب أبعاد الصورة التي تستوعب مصفوفة الألوان
4- بناء الصورة التي نحفظ بها مصفوفة الألوان
تنفيذ الفكرة:
لنفترض اننا نريد إخفاء تكست في صورة
اول شئ نفعله هو تعريف متغير يغبر عن تكست
PHP كود :
Dim txt As String = "visual basic for Arab, Hi ..... World"
PHP كود :
Dim txtBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(txt)
او تحويلها الي مصفو فة بايت بحيث كل اربعة بايت يساوي لون معين
ويمكن تنفيذ ذلك باستخدام دالة مثل هذه
PHP كود :
Public Iterator Function GetRawBytes(bytes As Byte(), Optional alpha As Byte = 128) As IEnumerable(Of Byte)
Dim i As Integer = 0
While i < bytes.Length
Yield bytes(i)
Yield bytes(i)
Yield bytes(i)
Yield alpha
i += 1
End While
Return
End Function
يمكن استخدام دالة مثل هذه
PHP كود :
Private Function ToRawData(values As Byte(), size As Integer, Optional baseValue As Byte = 128) As Byte()
Dim result As Byte() = New Byte(((values.Length * size)) - 1) {}
Dim i As Integer = 0
While i < values.Length
Dim items As Byte() = New Byte(size - 1) {}
Dim j As Integer = 0
While j < size
items(j) = values(i)
j += 1
End While
Dim newItems As Byte() = New Byte(items.Length + 1) {}
items.CopyTo(newItems, 1)
newItems(0) = baseValue
System.Buffer.BlockCopy(newItems, 0, result, (i * size), size)
i += 1
End While
Return result
End Function
PHP كود :
Private Function ToRawData(values As Byte(), size As Integer) As Byte()
Dim result As Byte() = New Byte(((values.Length * size)) - 1) {}
Dim i As Integer = 0
While i < values.Length
Dim items As Byte() = New Byte(size - 1) {}
Dim j As Integer = 0
While j < size
items(j) = values(i)
j += 1
End While
System.Buffer.BlockCopy(items, 0, result, (i * size), size)
i += 1
End While
Return result
End Function
مثال توضيحي صغير
لنفترض اننا نريد تحويل الخرف "A" الي مصفوفة بايت '
ملحوظة:
طبعا التعامل مع الحروف العربية يختلف قليلا عن التعامل مع الحروف الانجليزية
حيث أن كل حرف عربي وعند تحويله الي مصفوفة بايت فإن كل حرف يعادل 2 بايت و ليس بايت واحد كما في اللغة الانجليزية
PHP كود :
Dim a As Char = "A"c
Dim b As Byte = CByte(AscW(a))
Dim bytes As Byte() = New Byte() {b}
ما يجب أن نفعله هو ان نحول مصفوفة البايت للحرف "A" لتكون كالتالي
PHP كود :
Dim colors As Byte() = New Byte() {b, b, b, b}
او يمكن ان نجعلها كالتالي
PHP كود :
Dim alpha As Byte = 128
Dim colors As Byte() = New Byte() {alpha, b, b, b}
هذه الخطوة من الكود يجب الاهتمام بها جدا لأنها الاساس لإسترجاع البيانات الأصلية لاحقا
ومنها أيضا سوف نحسب أبعاد الصورة التي نحتاجها لحفظ المعلومات بداخلها
أخيرا حساب أبعاد الصورة
يتم حساب أبعاد الصورة من المعادلة التالية
bytes length = ( Width in pixels × height in pixels × colour depth ) /8
حيث أن
width = عرض الصورة
height = طول الصورة
image pixel format = pixel format
نصيحة يجب تثبيت قيمةالبكسل فورمات و اجعل هذه القيمة تساوي 32 دائما
يجب ان نضع في اعتبارنا ان اكبر Length لمصفوفة الألوان يجب ان لا يتعدي القيمة (2^32 = 4294967296)
الأن لنكتب الكود كاملا
PHP كود :
Dim txt As String = "visual basic for Arab, Hi ..... World"
Dim txtBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(txt)
Dim colorbytes As Byte() = ToRawData(txtBytes, 4)
' حساب ابعاد الصورة
' نفترض ان طول الصورة يساوي عرض الصورة
Dim colorDepth As Integer = 32
Dim length As Long = CLng(colorbytes.Length - 1)
Dim w As Double = Math.Sqrt(8 * length / colorDepth)
انشاء الصورة و حفظها
كود :
' أخيرا نيني الصورة
Dim bmp As Bitmap = BytesToBitmap(colorbytes, CInt(w + 1), CInt(w + 1))
bmp.Save(".\txtImage.jpg")
يمكن استخدام الدالة التالية لتحويل مصفوفة بايت الي صورة
PHP كود :
Private Function BytesToBitmap(buffer() As Byte, width As Integer, height As Integer) As Drawing.Bitmap
Dim bmp As New System.Drawing.Bitmap(width, height)
Dim data As Imaging.BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.ImageLockMode.WriteOnly, Imaging.PixelFormat.Format32bppArgb)
Runtime.InteropServices.Marshal.Copy(buffer, 0, data.Scan0, buffer.Length)
bmp.UnlockBits(data)
Return bmp
End Function
الكود كاملا
PHP كود :
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim txt As String = "visual basic for Arab, Hi ..... World"
Dim txtBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(txt)
Dim colorbytes As Byte() = ToRawData(txtBytes, 4)
' حساب ابعاد الصورة
' نفترض ان طول الصورة يساوي عرض الصورة
Dim colorDepth As Integer = 32
Dim length As Long = CLng(colorbytes.Length - 1)
Dim w As Double = Math.Sqrt(8 * length / colorDepth)
' أخيرا نيني الصورة
Dim bmp As Bitmap = BytesToBitmap(colorbytes, CInt(w + 1), CInt(w + 1))
bmp.Save(".\txtImage.jpg")
End Sub
Private Function ToRawData(values As Byte(), size As Integer) As Byte()
Dim result As Byte() = New Byte(((values.Length * size)) - 1) {}
Dim i As Integer = 0
While i < values.Length
Dim items As Byte() = New Byte(size - 1) {}
Dim j As Integer = 0
While j < size
items(j) = values(i)
j += 1
End While
System.Buffer.BlockCopy(items, 0, result, (i * size), size)
i += 1
End While
Return result
End Function
Private Function BytesToBitmap(buffer() As Byte, width As Integer, height As Integer) As Drawing.Bitmap
Dim bmp As New System.Drawing.Bitmap(width, height)
Dim data As Imaging.BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.ImageLockMode.WriteOnly, Imaging.PixelFormat.Format32bppArgb)
Runtime.InteropServices.Marshal.Copy(buffer, 0, data.Scan0, buffer.Length)
bmp.UnlockBits(data)
Return bmp
End Function
End Class
أتمني أن الموضوع يكون مفيدا للبعض منكم
Retired