السلام عليكم
فى الدرس السابق قمنا بشرح التشفير وانواعه وتطرقنا الى النوع الاول منه وهو التشفير المتناظر(المفتاح السرى) واستخدمنا خوارزميةTriple-DES
وهذا رابط الدرس الاول
وسنتابع الحديث هنا عن التشفير الغير متناظر(المفتاح العام)
على خلاف التشفير المتناظر(بالمفتاح السرى)، يستخدم فى التشفير الغير متناظر مفتاحين. واحد يسمى المفتاح العام(public key)والاخر يسمى المفتاح الخاص(private key)
.المفتاح العام(Public Key)
هو الرقم الذي يتم تداولة و نشره بين بقية المستخدمين لتشفير أي معلومات أو رسالة الكترونية مخصصة لك و يعتبر رقمك العام اساس عملية التشفير و لا يستطيع أحد فك رموز تلك المعلومة غيرك انت لأنها تحتاج الى الرقم السري و ليكن هو المفتاح الخاص بك لإكمال العملية الحسابية والوصول الى الرقم الأساس وبالتالي فتح الملفات مرة أخرى
المفتاح الخاص : هو النصف الاَخر المكمل للمفتاح العام للوصول الى الرقم الأساس واعادة المعلومات المشفرة الى وضعها الطبيعي قبل التشفير ، و هذا المفتاح هو الذي يميز كل شخص عن غيره من المستخدمين ويكون بمثابة هوية الكترونية تمكن صاحبها من فك أي معلومة مشفرة مرسله اليه على أساس رقمه العام ولذلك يجب عليك الاحتفاظ بالمفتاح الخاص سرا وهذ ما يعرف ب
Private Key
يزودنا .NETFrameWoerk الفئات التالية للتعامل مع التشفير الغير متناظر:
Dsacryptoserviceprovider
Rsacryptoserviceprovider
تعتبر خوارزميةRSA احدى اشهر الخوارزميات والتقنيات المستخدمة فى التشفير المتناظر. الاختصار RSA يشير الىRivest, Shamir, and Adelman ,وهى اسماء مخترعى هذه التقنية. الدوت نت يزودنا بالفئة Rsacryptoserviceprovider الذي يغلّف هذه الخوارزمية. وسنحاول فى هذا الدرس شرح هذه الفئة فى تشفير البيانات.
حيث نحن كمبرمجين ومطورين لا تهمنا التركيبة الداخليه للخوارزم المستخدم ولكن ما يهمنا هو حماية بياناتنا من السرقة
سننشى فئةClass وسنسميها PublicKeySecurityHelperتحتوى على دالتينMethod واحدة لتشفير البيانات والاخرى لفك التشفير كما سننشى فئة اخرى وسنسميها MyRSAInfo وسنستخدمها فى تخزين المفتاح العام والمفتاح الخاص
هذا هو الكود للفئتين
Imports System.Security.Cryptography Imports System.IO Imports System.Text Public Class PublicKeySecurityHelper Public Function Encrypt(ByVal strData As String) As MyRSAInfo Dim myrsa As New MyRSAInfo Dim p As CspParameters = New CspParameters p.Flags = CspProviderFlags.UseMachineKeyStore myrsa.Parameters = p Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(p) Dim data() As Byte = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), False) myrsa.PublicKey = rsa.ToXmlString(False) myrsa.PrivateKey = rsa.ToXmlString(True) myrsa.Data = data Return myrsa End Function Public Function Decrypt(ByVal myrsa As MyRSAInfo) As Byte() Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(myrsa.Parameters) rsa.FromXmlString(myrsa.PublicKey) Dim data() As Byte = rsa.Decrypt(myrsa.Data, False) Return data End Function End Class Public Class MyRSAInfo Public PublicKey As String Public PrivateKey As String Public Parameters As CspParameters Public Data() As Byte End Class
شرح الكود
اولا تشفير البيانات 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() ولكن تقوم بعكس الوظيفه
بهذا نكون قد انتهينا من هذا النوع من التشفير
مثال فى المرفقات


