تشفير كلمات المرور
نحتاج في الكثير من الأحيان ان نقوم بحفظ كلمة مرور في ملف أو على القرص أو في سجل ..... الخ ..
فإذا قمنا بحفظ هذه الكلمة كما هي فإننا نعرض كامل المنظومة للدخول غي المسموح , ونعرض نفسنا لخطر اختراق برنامجنا ...
لذلك وجدت انه من المفيد وضع مثال بسيط عن آلية تشفير كلمات المرور .
بحيث نشفر كلمة المرور قبل حفظها , وبالتالي الملف سيحوي كلمة المرور المعدلة , والتي يصعب العثور منها على الكلمة الأصلية إلا باتباع عكس خطوات خوارزمية التشفير
1- تشفير كلمة المرور ثم حفظ الكلمة المشفرة على القرص
2- إعادة فك تشفير الكلمة للتأكد من مطابقة الكلمة المدخلة من قبل المستخدم معها ..
مثال على تشفير بسيط
بما أننا نتعامل مع أحرف , فيصعب إجراء عمليات عى الأحرف لذلك سنقوم بتحويل الأحرف إلى أرقام عن طريق الدالة ord التي تعطينا الترتيب الرقمي بالآسكي المقابل للحرف المعطى
بعد ان أصبح لدينا رقم نسطيع ان نقوم بعملية على الرقم مثل جمع رقم معين أو القيام بعمليه ما علية ,,, أنا سأقوم بجمع ترتيب الحرف إلى قيمة الحرف مما يصعب إجراء عملية الفك , وهذا أفضل من جمع نفس العدد لكل مرة , حيث أول حرف نجمع له 1 , الثاني 2 , الثالث نجمع 3 , وهكذا ...
ملاحظة :
لإعادة تحويل الحرف إلى رقم نستخدم الدالى chr التي تعيد الحرف المقابل
أولا قراءة حرف واحد من السلسلة :
وذلك بالتعليمة
c:= s1[3];
حيث ستتم قراءة المحرف الثالث .
ولكي نقوم بجعل العملية أوتوماتيكية , لابأس بإضافة حلقة للمرور على جميع العناصر , بحيث يكون المتحول i هو رقم العنصر الحالي أي :
for i := 1 to length(s1) do begin c:= s1; end;
حيث المتحول C سيحوي المحرف الحالي لوحدة ..
للحصول على رقم المحرف ووضعة في المتحول n نقوم بالداله :
n:= ord(c);
والآن نقوم بعملية رياضية على الرقم n , ومثلا كما قلنا نجمع ترتيب الرقم (i) إلى قيمة الرقم :
n:=n+i;
نضع الحرف في سلسلة أخرى أنتظارا لإنتهاء معالجة جميع عناصر السالسة المتبقية , مع تذكر ان chr تعيد الحرف من القيمة الرقمية
s2:=s2+chr(n);
كما تلاحظ معظم الأمور ستبقى نفسها في حال رغبت بالقيام بتشفيرك الخاص , والسطر الذي سيتغير هو سطر العملية الحسابية على n ... أي: n=n+i
---------------------------
للقيام بفك التشفير ..
نعيد نفس الخطوات , ولكن سطر العملية الحسابية على n يجب أن يقوم بعكس العمل (أي بما أننا كنا قد أضفنا ترتريب الحرف , فيجب إذا أن نقوم بطرح ترتيب الحرف لاسترجاع النص الأصلي)
أي نترك كل شيء ونبدل السطر n إلى التالي :
n:=n-i;
والآن نضع هذين الإجرائين في تابعين لسهولة إستخدامهما :
function TForm3.get_password(s1: string): string; var s2:string; c:char; i,n:integer; begin s2:=''; for i := 1 to length(s1) do begin c:= s1; n:= ord(c); n:=n+i; //here you can change the coding s2:=s2+chr(n); end; Result:=s2; end; function TForm3.set_password(s1: string): string; var s2:string; c:char; i,n:integer; begin s2:=''; for i := 1 to length(s1) do begin c:= s1; n:= ord(c); n:=n-i;// عكس العملية السابقة s2:=s2+chr(n); end; Result:=s2; end;
لاستدعاء التابعين بمثال عملي :
قم بوضع 3 Edit على الفورم , واحد للكلمة الأصلية الثاني للكلمة المشفرة , الثالث لاسترجاع الكلمة الأصلية من الكلمة المشفرة ..
و2 Button , واحد للتشفير والثاني لفك التشفير ,,
وللإستخدام, لاحظ استدعاء الإجرائين السابقين ببساطه :
procedure TForm3.Button1Click(Sender: TObject); begin Edit2.Text:=set_password(Edit1.Text); end; procedure TForm3.Button2Click(Sender: TObject); begin Edit3.Text:=get_password(Edit2.Text); end;
يفضل القيام بعمليات تزيد عدد حروف كلمة السر , مثلا يضع محرف عشوائي بين كل حرف , أو شيء من هذا ..
هذه صور للمثال . وتنفيذ المثال سهل على من يحب :
