تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
درس-التشفير - الجزء الثانى(Deep in)
#1
كاتب الموضوع : SHADY_20075

السلام عليكم
فى الدرس السابق قمنا بشرح التشفير وانواعه وتطرقنا الى النوع الاول منه وهو التشفير المتناظر(المفتاح السرى) واستخدمنا خوارزميةTriple-DES
وسنتابع الحديث هنا عن التشفير الغير متناظر(المفتاح العام)
على خلاف التشفير المتناظر(بالمفتاح السرى)، يستخدم فى التشفير الغير متناظر مفتاحين. واحد يسمى المفتاح العام(public key)والاخر يسمى المفتاح الخاص(private key)
.المفتاح العام(Public Key)
هو الرقم الذي يتم تداولة و نشره بين بقية المستخدمين لتشفير أي معلومات أو رسالة الكترونية مخصصة لك و يعتبر رقمك العام اساس عملية التشفير و لا يستطيع أحد فك رموز تلك المعلومة غيرك انت لأنها تحتاج الى الرقم السري و ليكن هو المفتاح الخاص بك لإكمال العملية الحسابية والوصول الى الرقم الأساس وبالتالي فتح الملفات مرة أخرى
المفتاح الخاص : هو النصف الاَخر المكمل للمفتاح العام للوصول الى الرقم الأساس واعادة المعلومات المشفرة الى وضعها الطبيعي قبل التشفير ، و هذا المفتاح هو الذي يميز كل شخص عن غيره من المستخدمين ويكون بمثابة هوية الكترونية تمكن صاحبها من فك أي معلومة مشفرة مرسله اليه على أساس رقمه العام ولذلك يجب عليك الاحتفاظ بالمفتاح الخاص سرا وهذ ما يعرف ب
Private Key

يزودنا .NETFrameWoerk الفئات التالية للتعامل مع التشفير الغير متناظر:

Dsacryptoserviceprovider
Rsacryptoserviceprovider


تعتبر خوارزميةRSA احدى اشهر الخوارزميات والتقنيات المستخدمة فى التشفير المتناظر. الاختصار RSA يشير الىRivest, Shamir, and Adelman ,وهى اسماء مخترعى هذه التقنية. الدوت نت يزودنا بالفئة Rsacryptoserviceprovider الذي يغلّف هذه الخوارزمية. وسنحاول فى هذا الدرس شرح هذه الفئة فى تشفير البيانات.
حيث نحن كمبرمجين ومطورين لا تهمنا التركيبة الداخليه للخوارزم المستخدم ولكن ما يهمنا هو حماية بياناتنا من السرقة

سننشى فئةClass وسنسميها PublicKeySecurityHelperتحتوى على دالتينMethod واحدة لتشفير البيانات والاخرى لفك التشفير كما سننشى فئة اخرى وسنسميها MyRSAInfo وسنستخدمها فى تخزين المفتاح العام والمفتاح الخاص


كود :
using System.Security.Cryptography;
using System.IO;
using System.Text;

public class PublicKeySecurityHelper
{
public MyRSAInfo Encrypt(string strData)
{
MyRSAInfo myrsa = new MyRSAInfo();
CspParameters p = new CspParameters();
p.Flags = CspProviderFlags.UseMachineKeyStore;
myrsa.Parameters = p;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(p);
byte[] data = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), false);
myrsa.PublicKey = rsa.ToXmlString(false);
myrsa.PrivateKey = rsa.ToXmlString(true);
myrsa.Data = data;
return myrsa;
}

public byte[] Decrypt(MyRSAInfo myrsa)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(myrsa.Parameters);
rsa.FromXmlString(myrsa.PublicKey);
byte[] data = rsa.Decrypt(myrsa.Data, false);
return data;
}

}

public class MyRSAInfo
{
public string PublicKey;
public string PrivateKey;
public CspParameters Parameters;
public byte[] Data;
}




شرح الكود
اولا تشفير البيانات Encrypting data
• فى البدايه قمنا باستيراد فضاءات الاسماء التى سنتعامل معها واهمها هنا System.Security.Cryptography لانه هو الذى يحتوى على الفئة RSACryptoServiceProvider
• قمنا بانشاء الدالة Encrypt() وهى المستخدمة فى التشفير وهى تستقبل نص(المراد تشفيره) وتعود بنسخه من الفئة MyRSAInfo وهى تحتوى على النص المشفر
• الفئة MyRSAInfo تحتوى على اربعة اعضاء او متغرات هى: PublicKey ويستخدم لتخزين المفتاح العام , PrivateKeyلتخزين المفتاح الخاص الذين يتم توليدهم , Parametersمتغير من نوع CspParametersالذى يستخدم لتوليد المفاتيح العامة والخاصة , Data()مصفوفة من البايتات وهى تمثل النص المشفر
• نعدو لدالة التشفير حيث انشئنا فيه كائن من الفئه CspParametersواسندنا للخاصية Flag القيمة CspProviderFlags.UseMachineKeyStore وهى احدى قيم ال enumerationالتى تاخذها وهذه الفييمة تحدد من اى مكان سياخذ معلومات المفتاح
• ثم انشئنا كائن من الفئة RSACryptoServiceProvider ومررنا لها الكائنCspParameters السابق انشاءه والمسمى p
• قمنا باستدعاء الطريقةEncrypt() method للفئة RSACryptoServiceProviderومررنا لها البيانات المراد تشفيرها وذلك طبعا بعد تحويلها الى مصفوفه من البايتات باستخدام الطريقة GetBytes() التى تعود للفئة Encoding الموجوده فى فضاء الاسماء Text والبارميتر الثانى للطريقة Encrypt() هو من النوع Boolean فاذا كان true يتم استخدام OAEP padding فى التشفير وللعلم هذا الشكل لا يعمل الا على windows xp ولذلك قمنا بتمررير القيمة false والتى تشير الى استخدام PKCS#1 v1.5 padding, وطبعا الداله او الطريقة Encrypt() تعود بمصفوفة من البايتات byte array تمثل البيانات بعد تشفيرها وقمنا باسنادها للمتغير من نفس النوع اسميناه data
• اخيرا قمنا بتعبئه اعضاء الفئئه MyRSAInfo التى انشئنا نسخه منها واسميناها myrsa

واستخدمنا الداله ToXmlString والتى تعود بنص على هيئه xml يمثل كائن RSA وتاخذ بارميتر من النوع Boolean فاذا كان true فستعود بنص يشمل حتى المفتاح الخاص

Decrypting data ثانيا فك التشفير
• قمنا بانشاء الداله Decrypt() التى تستقبل كائن من الفئة MyRSAInfoوهذا الكائن يجب ان يكون احدى النسخ التى تعود بها الطريقة Encrypt() اى انه يجب ان يكون الكائن الممرر للداله Decrypt()هو نفس الكائن التى تعود به الداله التى استخدمت لتشفير البيانات المراد فك تشفيرها وطبعا هذه الداله تعود ب مصفوفه من البايت تمثل البيانات الطبيعية
• داخل الداله Decrypt() قمنا بانشاء كائن من الفئة RSACryptoServiceProvider ومررنا له نفس البارميتر
• قمنا باستدعاء الطريقة FromXmlString() للفئة RSACryptoServiceProviderومررنا لها المفتاح العام الذى انشئ سابقا
• اخيرا قمنا باستدعاء الطريقة Decrypt() ايضا الخاصة بالفئةRSACryptoServiceProvider ومررنا لها البارميتر الخاص بها وهى تاخذ نفس البارميتر الخاص بالطريقةEncrypt() ولكن تقوم بعكس الوظيفه



بهذا نكون قد انتهينا من هذا النوع من التشفير


تقنية الارقام المختلطةHashes



خوارزميات الارقام المختلطة تنشئ مخرجات ثابته الطول لمعطيات منغيرة من البيانات. فاذا قام اى شخص بتغيير البيانات الاصليه فستكون الارقام المولدة مختلفة عن الارقام المولدة الاصليه وبهذه الطريقة تستطيع التاكد من صحة البيانات اذا قام احدهم بالتلاعب فيها. وهى غالبا تستخدم فى التواقيع الرقمية .

وهذه هى الفئات التى تتعامل مع الارقام المختلطة(hashes):

SHA1Managed
MD5CryptoServiceProvider
MACTripleDES

ملاحظة: خوارزمية SHA1 تم كسرها من قبل القراصنه فهى لم تعد مستخدمه عمليا


والان سنقوم بعمل مثال لاستخدام هذه الطريقة باستخدام خوارزمية MD5



كود :
using System;
using System.Security.Cryptography;
using System.Text;
public class MD5HashHelper
{
public byte[] GetHash(string message)
{
byte[] data;
data = UTF8Encoding.ASCII.GetBytes(message);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
return md5.ComputeHash(data, 0, data.Length);

}

public bool VerifyHash(string message, byte[] hash)
{
byte[] data;
data = UTF8Encoding.ASCII.GetBytes(message);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hashTemp = md5.ComputeHash(data, 0, data.Length);
for (Int32 counter = 0; counter <= hash.Length - 1; counter += 1) {
if (hash(counter) != hashTemp(counter)) {
return false;
}
}
return true;

}
}
شرح الكود
• فى البداية قمنا باستيراد فضاءات الاسماء اللازمة
• ثم قمنا بانشاء الفئة MD5HashHelper وهى تحتوى على الطرريقتين ,GetHash VerifyHash
• الداله GetHash() تستقبل نص وتعود الداله بمصفوفة من البايت تمثل قيمه الهاش المحسوب
• فى داخل الداله GetHash() استخدمنا الفئة UTF8Encoding للحصول على byte array تمثل النص المرسل
• ثم انششئنا كائن من الفئة MD5CryptoServiceProvider واستدعينا الطريقة ComputeHash ومررنا لها النص المحول الى byte array
• الدالة ComputeHash تستقبل byte array وتقوم بحساب قيمة الهاش له وتعود ايضا ب byte array ويمثل قيمة الهاش
• الداله VerifyHashتستقبل نص وهو النص الذى نريد التحقق من صحته وكذلك تستقبل byte array تمثل قمية الهاش المولده مسبقا لهذا النص وهى تعود بقيمة منطقية true اذا لم يتم العبث بالبيانات والعكس
• فى هذه الداله قمنا قمنا بمثل ما عملناه فى الداله السابقة حيث قمنا بتوليد قيمة هاش للنص وثم عملنا حلقة دوران وقمنا فيها بمقارنه كل بايت لكل من الهاش المولد وقيمة الهاش المولده مسبقا فاذا كانت متطابقة عدنا بtrue واذا اختلف عدنا ب false


وهكذا بهذه الطريقة تستطيع التاكد من صحة البيانات االمرسلة اذا كانت سليمة او تم تم العبث بها



التواقيع الرقميةDigital Signatures


التواقيع الرقمية تستخدم للتحقق من هوية المرسل والتاكد من سلامة البيانات . وهو يستخدم غالبا مع التشفير الغير متناظر(المفتاح العام)
الية عمل التواقيع الرقمية

يطبّق المرسل خوارزمية hash إلى البيانات المرسلة وينشئ رسالة ملخص . هذه الرساله هى عبارة عن تمثسل وتوضيح للبيانات المرسلة.
ثم يقوم المرسل بتشفير الرسالة مع المفتاح الخاص للحصول على التوقيع الرقمى
وبعد ذلك يقوم بارسال البيانات ضمن قناة امنه
يستلم المستلم البيانات ويفك تشفير التوقيع الرقمى باستخدام المفتاح العام ويسترجع الرسالة الملخصه
يطبّق المستلم نفس خوارزمية الhash التى استخدمها المرسل وينشئ رساله ملخص جديده للبيانات
اذا تطابق ملخص المستلم مع ملخص المرسل فان هذا يعنى ان الرسالة قادمة من المكان الصحيح

اطار العمل دوت نت يوفر لنا الفئات التالية للعمل مع التواقيع الرقمية

RSACryptoServiceProvider للتشفير اللا متناظر
RSAPKCS1SignatureFormatter للتواقيع الرقمية

مثال
فى هذا المثال سننشئ فئة ونسميها DigitalSignatureHelper وهى التى سنستخدمها فى انشاء التواقيع الرقمية والتاكد منها وكذلك سنستخدم الفئة MD5HashHelper
لتوليد قيم الهاش

وهذا هو الكود


كود :
using System;
using System.Security.Cryptography;

public class DigitalSignatureHelper
{
private RSAParameters m_private;
private RSAParameters m_public;
public byte[] CreateSignature(byte[] hash)
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
RSAFormatter.SetHashAlgorithm("MD5");
m_public = RSA.ExportParameters(false);
m_private = RSA.ExportParameters(true);
return RSAFormatter.CreateSignature(hash);

}
public bool VerifySignature(byte[] hash, byte[] signedhash)
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSAParameters RSAKeyInfo = new RSAParameters();
RSAKeyInfo.Modulus = m_public.Modulus;
RSAKeyInfo.Exponent = m_public.Exponent;
RSA.ImportParameters(RSAKeyInfo);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
RSADeformatter.SetHashAlgorithm("MD5");
return RSADeformatter.VerifySignature(hash, signedhash);
}
}

شرح الكود

• انشئنا الفئة وهى تحتوى على متغيرين من النوع RSAParametersيتم فيها تخزين المعلومات عن المفتاح الخاص والوالعام
• انشئنا داله CreateSignature() وهى تشتقبل مصفموفة بايت تمثل قيمة الهاش وتعود بمصفوفة بايت تمثل التوقيع الرقمى لللهاش
• فى داخل الداله قمنا بانشاء كائن من الفئة RSACryptoServiceProvide وانشئنا كائن اخر من الفئة RSAPKCS1SignatureFormatter ومررنا له الكائن المنشاء من الفئةالاولى
• الفئة RSAPKCS1SignatureFormatter مسؤلة عن انشاء ما يسمى PKCS #1 او(Public Key Cryptographic Signature version 1.5 signature)
• قمنا باستدعاء الطريقة SetHashAlgorithm() التى تاخد اسم الخوارزم المستخدم فى توليد الهاش كباراميتر ونحن هنا نسنخدم خوارزم MD5
• قمنا باستعاء الطريقة ExportParameters() للحصول على المفتاح العام والخاص وتخزينهما فى المتغيرات
• واخر شئ قمنا باستدعاء الطريقة CreateSignature وهى التى تقوم بانشاء التوقيع الرقمى وتعود به على هيئة مصفوفة بايت وهى القيمة التى تعود بها دالتنا
}}}
تم الشكر بواسطة:
#2
وده موقع لتحويل الكود من c# الى vb

والسلام عليكم ورحمة الله وبركاته
}}}
تم الشكر بواسطة:
#3
http://labs.developerfusion.co.uk/co...to-csharp.aspx
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيفيه اداره الاحداث فى بيئه الدوت نت الجزء الثالث how To Handle Events in.net Part 3 RaggiTech 0 1,955 09-10-12, 05:22 PM
آخر رد: RaggiTech
  كيفيه اداره الاحداث فى بيئه الدوت نت الجزء الثانى how To Handle Events in .net Part 2 RaggiTech 0 1,963 09-10-12, 05:21 PM
آخر رد: RaggiTech
  كيفيه اداره الاحداث فى بيئه الدوت نت الجزء الاول part 1 how to Handle Events in .net RaggiTech 0 1,848 09-10-12, 05:20 PM
آخر رد: RaggiTech
  نظرة على جديد الفيجوال بيسك 9 - الجزء الأول RaggiTech 0 2,091 08-10-12, 05:38 PM
آخر رد: RaggiTech
  Windows Message Queue &amp; Message Pumping(Deep Threading 2) RaggiTech 0 1,797 08-10-12, 12:15 PM
آخر رد: RaggiTech
  Visual Studio Extensibility الجزء الثاني- توسيع إطار الأدوات RaggiTech 2 2,363 08-10-12, 12:14 PM
آخر رد: RaggiTech
  Rugular Expression الجزء الثالث RaggiTech 0 1,913 08-10-12, 11:57 AM
آخر رد: RaggiTech
  Regular Expression الجزء الثانى RaggiTech 0 1,879 08-10-12, 11:54 AM
آخر رد: RaggiTech
  Regular Expression الجزء الاول RaggiTech 0 2,029 08-10-12, 11:53 AM
آخر رد: RaggiTech
  (InvokeRequired &amp; BeginInvoke(Deep Threading 3 RaggiTech 0 1,805 08-10-12, 11:45 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم