مرحبا :
برمجة شفرة فجنير Vigenere Cipher :
احد طرق التشفير متعدد الابجدية الابدالية polyalphabetic substitution
اخترعت هذه الشفرة من قبل الفرنسي بليز دي فجنير , تعتبر شفرة فجنير من اقوى الشفرات في التشفير التقليدي , حيث لم تكسر هذه الشفرة لعشرات السنين , اعتقدوا بأن هذه الشفرة غير قابلة للكسر , حتى قام بكسرها العالم فريدريك كاسكي وهو ضابط برتبة رائد في المشاة البحرية الالمانية .
استخدمت هذه الطريقة في الحرب العالمية الاولى و الثانية .
. |
بليز دي فجنير |
تحتاج هذه الطريقة الى مفتاح انسيابي stream key ويجب ان يكون بنفس طول النص الواضح plain text واذا كانت اقل منها نكرر احرف المفتاح الانسيابي على التوالي . مثال : شفّر النص الواضح spyman اذا علمت ان المفتاح الانسيابي هو ali بأستخدام خوارزمية فجنيير .plain text : spyman
stream key : aliali
لاحظ بالمثال اعلاه قمنا بمضاعفة المفتاح الانسيابي stream key لكي يكون بطول النص الواضح .
طريقة التشفير Encryption :
تفترض هذه الطريقة وجود مصفوفة ثنائية ابعادها 26 * 26 و ان تشفير الكلمة الواضحة plain text يكون من تقابل الصفوف مع الاعمدة للحرف المختار من النص الواضح والحرف المختار من المفتاح الانسيابي . لاحظ الصورة ادناه :
طريقة فك التشفير Decryption :
1- نعتبر الصف الاول هو احرف المفتاح الانسيابي.
2- نختار اول حرف بالمفتاح الانسابي وننزل عمودياً وصولاً للحرف المشفر .
3- بعد ان وصلنا الى الحرف المشفر نرى ما يقابله بالعمود الاول (هو الحرف الصريح قبل تشفيره).
برمجة شفرة فجنير :
1- نحتاج الى نهج معالجة بروسيجر او دالة لمقارنة طول النص الواضح او المشفر مع طول المفتاح الانسابي .
في القسم العام اكتب الكود التالي :
كود PHP:
Private Sub streamkey(key)
For i = 1 To Abs(Len(Text1.Text) - Len(key))
c = Mid(key, i, 1)
If (Len(key) <= Len(Text1.Text)) Then
key = key & c
End If
Next i
If (Len(key) > Len(Text1.Text)) Then
key = Mid(key, i, Len(Text1.Text))
End If
End Sub
الان اضف ثلاث صناديق نصوص text box و زر امر عدد اثنين , قم بتغير اسم الاول الى encryption والثاني الى decryption
قم بأضافة الكود ادناه الى زر الامر الاول :
كود PHP:
al = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
x = Text1.Text
key = Text2.Text
Text2.Text = " "
Call streamkey(key)
For i = 1 To Len(x)
m = UCase(Mid(x, i, 1))
n = UCase(Mid(key, i, 1))
For j = 0 To 25
If (m = al(j)) Then
f = j
End If
Next j
For k = 0 To 25
If (n = al(k)) Then
g = k
End If
Next k
a = (f + g) Mod 26
t = t & al(a)
Next i
Text2.Text = key
Text3.Text = t
End Sub
Private Sub streamkey(key)
For i = 1 To Abs(Len(Text1.Text) - Len(key))
c = Mid(key, i, 1)
If (Len(key) <= Len(Text1.Text)) Then
key = key & c
End If
Next i
If (Len(key) > Len(Text1.Text)) Then
key = Mid(key, i, Len(Text1.Text))
End If
و بأضافة الكود ادناه في زر الامر الثاني الخاص بفك التشفير ,, لاحظ هنا نفحص هل المتغير a اكبر من صفر او لا .
فاذا كان اقل من صفر فهو سالب ولا يوجد اندكس للعدد السالب في المصفوفة لذلك نجد mod له على عدد الابجدية (26) وبما انه عدد سالب فأن الـ mod في التشفير يختلف و يتم ايجاده بجمع العدد مع 26 . (هذه الطريقة في رياضيات التشفير وليس في الرياضيات العامة) .
كود PHP:
al = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
x = Text1.Text
key = Text2.Text
Text2.Text = " "
Call streamkey(key)
For i = 1 To Len(x)
m = UCase(Mid(x, i, 1))
n = UCase(Mid(key, i, 1))
For j = 0 To 25
If (m = al(j)) Then
f = j
End If
Next j
For k = 0 To 25
If (n = al(k)) Then
g = k
End If
Next k
a = (f - g) Mod 26
If a < 0 Then
a = a + 26
t = t & al(a)
Else
t = t & al(a)
End If
Next i
Text2.Text = key
Text3.Text = t
هذه طريقة اخرى لحل فجنير ( من قبل اجنبية صاكة ) :
اتمنى لكم التوفيق