أشعر أن الأمر مضى وقتًا طويلاً منذ آخر مرة كتبت فيها مدونة. اسمحوا لي أن أشتكي أولا. هذا الشهر ، تعمل الشركة على العمل الإضافي ، ونشر المنشور وإطلاقه ، والمشاريع الجديدة ضيقة للغاية ، لذلك لن أقول الكثير عن المشروعات المحددة. اليوم ، من المهم حقًا التحدث عن التشفير غير المتماثل. التشفير غير المتماثل لا غنى عنه في حياتنا اليومية.
مفهوم
قبل الحديث عن RSA ، دعنا نتحدث أولاً عن التشفير غير المتماثل. عند الحديث عن التشفير المتماثل ، قيل ذات مرة أن خوارزميات التشفير المتماثل تستخدم نفس المفتاح السري عند تشفير وفك التشفير ، ويجب على كلا الطرفين تشفير وفك التشفير استخدام نفس المفتاح للتواصل بشكل طبيعي. التشفير غير المتماثل ليس هو الحال. تتطلب خوارزمية التشفير غير المتماثلة مفتاحين لتشفير وفك التشفير ، وهما المفتاح العام والمفتاح الخاص.
شيء واحد يجب ملاحظته هو أن المفتاح العام والمفتاح الخاص يجب أن يكونان زوجًا. إذا تم تشفير البيانات باستخدام المفتاح العام ، فيمكن فك تشفير المفتاح الخاص المقابل فقط ، والعكس صحيح. نظرًا لأن التشفير وفك التشفير يستخدمان مفتاحين مختلفين ، فإن هذه الخوارزمية تسمى خوارزمية التشفير غير المتماثل.
عملية العمل
كما هو موضح في الشكل أدناه ، يتم إرسال البيانات باستخدام التشفير غير المتماثل.
تشمل الخوارزميات الرئيسية المستخدمة في التشفير غير المتماثل: RSA ، Elgamal ، خوارزمية حقيبة الظهر ، Rabin ، DH ، ECC (خوارزمية تشفير المنحنى الإهليلجي) ، وما إلى ذلك اليوم ، سنقدم بشكل أساسي RSA. أما بالنسبة للخوارزميات الأخرى ، فسنختار عدد قليل لتقديمها لاحقًا.
RSA
في الواقع ، ظهرت RSA في وقت مبكر من عام 1978 ، وكانت أول خوارزمية يمكن استخدامها في كل من تشفير البيانات والتوقيعات الرقمية. من السهل فهمها وتشغيلها وهي أيضًا تحظى بشعبية كبيرة. المبدأ كما هو موضح في عملية العمل أعلاه.
تعتمد خوارزمية RSA على حقيقة نظرية الأرقام البسيطة للغاية: من السهل مضاعفة رقمين كبيرتين ، ولكن من الصعب للغاية عوامل منتجاتها ، بحيث يمكن الكشف عن المنتج كمفتاح تشفير.
تنفيذ الكود
دعنا نلقي نظرة على تطبيق التعليمات البرمجية المحددة أدناه.
استيراد com.google.common.collect.maps ؛ استيراد sun.misc.base64decoder ؛ استيراد sun.misc.base64encoder ؛ استيراد javax.crypto.cipher ؛ استيراد java.security.*؛ استيراد java.security.Interfaces.rsapRivateKey ؛ استيراد java.security.interfaces.rsapublickey ؛ استيراد java.security.spec.pkcs8encodedkeyspec ؛ استيراد java.security.spec.x509encodedKeySpec ؛ استيراد java.util.map ؛ /*** تم إنشاؤه بواسطة Xiang.li في 2015/3/3. * RSA Encryption and Decryption Tool Class*/ Public Class RSA {/ *** تحديد طريقة التشفير*/ خاص سلسلة key_rsa = "RSA" ؛ / *** تحديد خوارزمية التوقيع*/ private final static String key_rsa_signature = "md5withrsa" ؛ / *** تحديد خوارزمية المفتاح العمومي*/ خاص الأساس الأساسي key_rsa_publickey = "rsapublickey" ؛ / *** تحديد خوارزمية المفاتيح الخاصة*/ private Final Static String key_rsa_privatekey = "rsapRiadeKey" ؛ / *** مفتاح التهيئة* return*/ الخريطة الثابتة العامة <string ، Object> init () {map <string ، Object> map = null ؛ حاول {keypairgenerator generator = keypairgenerator.getInstance (key_rsa) ؛ generator.initialize (1024) ؛ keypair keypair = generator.generatekeypair () ؛ // المفتاح العام rsapublickey publickey = (rsapublickey) keypair.getPublic () ؛ // مفتاح خاص rsapRivateKey privatekey = (rsApRivaleKey) keypair.getPrivin () ؛ // تغليف المفتاح كخريطة خريطة = maps.newhashmap () ؛ map.put (key_rsa_publickey ، publickey) ؛ map.put (key_rsa_privatekey ، privatekey) ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ } خريطة الإرجاع ؛ } / *** استخدم المفتاح الخاص لإنشاء توقيع رقمي للمعلومات* بيانات البيانات المشفرة* param privatekey مفتاح خاص* / علامة سلسلة ثابتة عامة (BYTE [] DATA ، String PrivateKey) {String str = "" ؛ جرب {// decrypt المفتاح الخاص المشفر بايت [] bytes = decryptbase64 (privateKey) ؛ // بناء كائن PKCS8ENCODEDEDKEYSPEC PKCS8ENCODEDEDEKESPEC PKCS = جديد PKCS8ENCODEDEDKEYSPEC (بايت) ؛ . // احصل على مفتاح المفتاح الخاص المفتاح الخاص = المصنع. // استخدم المفتاح الخاص لإنشاء توقيع رقمي للحصول على توقيع المعلومات = signature.getInstance (key_rsa_signature) ؛ signature.initsign (مفتاح) ؛ signature.update (البيانات) ؛ str = encryptbase64 (signature.sign ()) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع str ؛ } / *** تحقق من التوقيع الرقمي* param البيانات المشفرة البيانات* param publickey المفتاح العمومي* param sign digitature* return تحقق من عودة ناجحة ، فاشلة الإرجاع false* / public static boolean التحقق (byte [] data ، string publickey) {boolean flag ؛ حاول {// فك تشفير المفتاح العمومي المشفر بايت [] bytes = decryptbase64 (publickey) ؛ // بناء كائن X509EncodeDeDeKyspec X509EncodEdKeySpec Keyspec = جديد X509EncodEdKeySpec (بايت) ؛ . // احصل على مفتاح المفتاح العام publickey key = factory.generatepublic (keyspec) ؛ // تحقق من التوقيع الرقمي باستخدام توقيع المفتاح العام = signature.getInstance (key_rsa_signature) ؛ signature.initverify (مفتاح) ؛ signature.update (البيانات) ؛ flag = signature.verify (decryptbase64 (sign)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } العلم الإرجاع ؛ } / *** مفتاح خاص decrypt* param البيانات المشفرة* مفتاح المفتاح الخاص param* @REGANTURN* / public static byte [] decryptbyprivatekey (byte [] data ، مفتاح السلسلة) {byte [] result = null ؛ جرب {// decrypt the byte byte [] bytes = decryptbase64 (مفتاح) ؛ // الحصول على المفتاح الخاص PKCS8ENCODEDEDEKESPEC KEYSPEC = جديد PKCS8ENCODEDEDEKESPEC (بايت) ؛ keyfactory factory = keyfactory.getInstance (key_rsa) ؛ privatekey privatekey = factory.generateprivate (keyspec) ؛ // decrypt the cipher cipher cipher = cipher.getinstance (factory.getalgorithm ()) ؛ cipher.init (cipher.decrypt_mode ، privatekey) ؛ النتيجة = cipher.dofinal (البيانات) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ } / *** decryption مفتاح خاص* param البيانات المشفرة البيانات* مفتاح المفتاح param* @return* / public static byte [] decryptbypublickey (byte [] data ، مفتاح السلسلة) {byte [] result = null ؛ جرب {// decrypt the Bublic Key Byte [] bytes = decryptbase64 (key) ؛ // احصل على المفتاح العام x509encodedKeySpec keyspec = جديد x509encodedKeySpec (بايت) ؛ keyfactory factory = keyfactory.getInstance (key_rsa) ؛ publickey publickey = factory.generatepublic (keyspec) ؛ // decrypt the cipher cipher cipher = cipher.getinstance (factory.getalgorithm ()) ؛ cipher.init (cipher.decrypt_mode ، publickey) ؛ النتيجة = cipher.dofinal (البيانات) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ } / *** تشفير المفتاح العام* بيانات بيانات param ليتم تشفيرها* مفتاح مفتاح param العمومي* @RETURN* / public static byte [] EncryptByPublicKey (BYTE [] DATA ، مفتاح السلسلة) {byte [] result = null ؛ حاول {byte [] bytes = decryptbase64 (مفتاح) ؛ // احصل على المفتاح العام x509encodedKeySpec keyspec = جديد x509encodedKeySpec (بايت) ؛ keyfactory factory = keyfactory.getInstance (key_rsa) ؛ publickey publickey = factory.generatepublic (keyspec) ؛ . cipher.init (cipher.encrypt_mode ، publickey) ؛ النتيجة = cipher.dofinal (البيانات) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ } / *** تشفير المفتاح الخاص* بيانات param ليتم تشفيره* مفتاح مفتاح param الخاص* @REGARN* / public static byte [] incryptbyprivatekey (byte [] data ، مفتاح السلسلة) {byte [] result = null ؛ حاول {byte [] bytes = decryptbase64 (مفتاح) ؛ // احصل على المفتاح الخاص PKCS8ENCODEDEKYSPEC KEYSPEC = جديد PKCS8ENCODEDEDEKESPEC (بايت) ؛ keyfactory factory = keyfactory.getInstance (key_rsa) ؛ PrivateKey PrivateKey = factory.generateprivate (keyspec) ؛ . cipher.init (cipher.encrypt_mode ، privatekey) ؛ النتيجة = cipher.dofinal (البيانات) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } نتيجة الإرجاع ؛ } / ** * احصل على المفتاح العام * param map * regurn * / سلسلة ثابتة عامة getPublicKey (خريطة <string ، كائن> خريطة) {string str = "" ؛ Try {Key Key = (key) map.get (key_rsa_publickey) ؛ str = encryptbase64 (key.getenCoded ()) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع str ؛ } / ** * احصل على المفتاح الخاص * param map * @regurn * / static string public getPrivinKey (MAP <String ، Object> map) {String str = "" ؛ TREE {key key = (key) map.get (key_rsa_privatekey) ؛ str = encryptbase64 (key.getenCoded ()) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع str ؛ } / *** base64 decrypt* @param سلسلة مفاتيح يجب فك تشفيرها* @renturn byte array* athrows استثناء* / public static byte [] decryptbase64 (مفتاح السلسلة) يلقي استثناء {return (جديد base64decoder ()). decodeBuffer (مفتاح) ؛ } / *** BASE64 ENCRYPTION* PARAM KEY BYTE ARRAY التي يجب تشفيرها* @regurn string* athrows استثناء* / السلسلة الثابتة العامة incryptbase64 (مفتاح byte []) استثناء {return (new BASE64ENCODER ()). ENCODEBUFFER (مفتاح) ؛ } / *** طريقة الاختبار* param args* / public static void main (string [] args) {String privateKey = "" ؛ String PublicKey = "" ؛ // إنشاء خريطة مفتاح المفتاح الخاص <string ، Object> map = init () ؛ PublicKey = getPublicKey (MAP) ؛ PrivateKey = getPrivinKey (MAP) ؛ System.out.println ("المفتاح العمومي: /n /r" + publickey) ؛ System.out.println ("المفتاح الخاص: /n /r" + privatekey) ؛ System.out.println("Public key encryption------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "; byte[] encWord = incryptbublickey (word.getBytes () ، publickey) ؛ encryption---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- incryptbyprivatekey (English.getBytes () ، privatekey) ؛ String decenglish = سلسلة جديدة (DecryptBypublicKey (Encenglish ، publickey)) ؛ System.out.println ("قبل التشفير:" + English + "/N/R" + "بعد فك التشفير:" + decenglish) ؛ System.out.println ("توقيع التحقق من المفاتيح المفتاح-Signature-Public Signature") ؛ // إنشاء علامة سلسلة التوقيع = علامة (Encenglish ، privatekey) ؛ system.out.println ("signature:/r" + sign) ؛ // تحقق من حالة التوقيع المنطقي = تحقق (Encenglish ، publickey ، علامة) ؛ System.out.println ("الحالة:/r" + الحالة) ؛ }} تشفير النتائج وفك تشفيرها
خاتمة
في الواقع ، يمكن وصف عملية تبدو معقدة على ما يبدو في جملة واحدة: استخدام تشفير المفتاح العام وفك تشفير المفتاح الخاص ، يتم الانتهاء من نقل البيانات من الطرف B إلى الطرف A ، من خلال تشفير المفتاح الخاص وفك تشفير المفتاح العام ، وفي نفس الوقت ، يتم إكمال توقيع مفتاح خاص ومجموعة من البيانات العامة المتجددة من البيانات الكاملة.
إن ظهور خوارزميات التشفير غير المتماثلة هو حل مشكلة تشفير وفك تشفير مفتاح واحد فقط. طالما تم فقد هذا المفتاح أو الكشف عنه ، سيتم مهاجمة البيانات المشفرة بسهولة. في الوقت نفسه ، فإنه على وجه التحديد بسبب ظهور خوارزميات التشفير غير المتماثلة التي يتم الحصول على التوقيعات الرقمية اللاحقة ، والشهادات الرقمية ، وما إلى ذلك.
حسنًا ، دعنا نتوقف هنا اليوم. تستمر المقالة التالية في التشفير غير المتماثل. بالنسبة إلى أي واحد ، سأعرف في ذلك الوقت. اجعلها سرية هنا أولاً