مفهوم كلمة المرور غير المتماثلة
1. الفرق الرئيسي من خوارزميات التشفير المتماثل هو أن مفاتيح التشفير والتشفير مختلفة ، والآخر هو (المفتاح العام) والآخر سرية (المفتاح الخاص). إنه يحل بشكل أساسي مشكلة إدارة تخصيص المفاتيح لخوارزميات التشفير المتماثل ويحسن أمن الخوارزمية.
2. إن تشفير وفك تشفير خوارزميات التشفير غير المتماثلة منخفضة نسبيًا. في تصميم الخوارزمية ، تحتوي خوارزميات التشفير غير المتماثلة على متطلبات صارمة على طول البيانات المشفرة. على سبيل المثال ، تتطلب خوارزمية RSA أن تكون البيانات المشفرة يجب ألا تكون أكبر من 53 بايت.
3. تستخدم خوارزميات التشفير غير المتماثلة بشكل رئيسي لتبادل مفاتيح خوارزميات التشفير المتماثل ، بدلاً من تبادل البيانات.
4. Java6 يوفر خوارزميتين تنفذ DH و RSA. توفر قلعة نطاط دعم خوارزمية E1GAMAL. بالإضافة إلى الخوارزميات الثلاثة المذكورة أعلاه ، هناك أيضًا خوارزمية ECC ، ولا يوجد حاليًا أي مكون مفتوح المصدر ذي صلة لتوفير الدعم.
هناك حاجة مفتاحين للتشفير أو فك التشفير ، مقسمة إلى مفاتيح عامة وخاصة
الميزات: السلامة العالية ، السرعة البطيئة
يستخدم
【تبادل المفاتيح (DH)】
دون تحديد المفتاح المشترك ، يولد كلا الطرفين المفتاح ولا يوفرون أعمال التشفير. يتطلب التشفير وفك التشفير أيضًا خوارزميات تشفير متماثلة أخرى لتنفيذها.
مثال خوارزمية DH
استيراد javax.crypto.keyagreement ؛ استيراد javax.crypto.interfaces.dhprivatekey ؛ استيراد javax.crypto.interfaces.dhpublickey ؛ استيراد javax.crypto.spec.dhparametspec ؛ استيراد java.security. java.security.spec.x509encodedkeyspec ؛ import java.util.hashmap ؛ استيراد java.util.map ؛ // 1 إنشاء مفتاح المصدر // 2 المفتاح العام للمصدر يتم تسليمه إلى الهدف ، ويولد الهدف مفتاح العمومي والمفتاح الخاص من خلال المصدر. . Static Final String Private_Key = "DH_PRIVAL_KEY" ؛ /** * قم بإنشاء زوج مفتاح المصدر * RETURN * @Throws استثناء */خريطة ثابتة عامة <String ، Object> initsourceKey () يرمي استثناء {// إنشاء مثيل من keypairgenerator ، حدد DH خوارزمية keypairgenerator keypairgenerator = keypairgenerator. // تهيئة طول المفتاح ، الافتراضي 1024 ، النطاق الاختياري 512-65536 ومضاعفات 64 keypairgenerator.initialize (1024) ؛ // إنشاء زوج مفتاح KEYPAIR KEYPAIR = KEYPAIRGENERATOR.GENERATEKEYPAIR () ؛ dhpublickey dhpublickey = (dhpublickey) keypair.getpublic () ؛ dhprivatekey dhprivalKey = (dhprivatekey) keypair.getPrivate () ؛ // ضع زوج المفتاح في خريطة الخريطة <string ، Object> keymap = new hashmap <string ، Object> () ؛ keymap.put (public_key ، dhpublickey) ؛ keymap.put (private_key ، dhprivatekey) ؛ إرجاع keymap ؛ } / ** * قم بإنشاء زوج المفتاح الهدف من خلال المفتاح العام المصدر * param sourcepublickey * return * @Throws استثناء * / خريطة ثابتة عامة <string ، Object> initTargetKey (byte [] sourcepublickey) يلقي الاستثناء {keyfactory keyfactory = keyfactory.getInstance ("dh") ؛ // استخدم المفتاح العام للمصدر ، وإنشاء مفاتيح ، واستخدم keyfactory لإنشاء المعلومات المتعلقة بالمصدر x509encodedKeySpec Keyspec = جديد x509encodedKeySpec (SourcepublicKey) ؛ dhpublickey sourcepublic = (dhpublickey) keyfactory.generatepublic (keyspec) ؛ dhparameterspec dhpublickeyparams = sourcepublic.getParams () ؛ keypairgenerator keypairgenerator = keypairgenerator.getInstance ("dh") ؛ keypairgenerator.initialize (dhpublickeyparams) ؛ keypair keypair = keypairgenerator.generatekeypair () ؛ dhpublickey dhpublickey = (dhpublickey) keypair.getpublic () ؛ dhprivatekey dhprivalKey = (dhprivatekey) keypair.getPrivate () ؛ // ضع زوج المفتاح في خريطة الخريطة <string ، Object> keymap = new hashmap <string ، Object> () ؛ keymap.put (public_key ، dhpublickey) ؛ keymap.put (private_key ، dhprivatekey) ؛ إرجاع keymap ؛ } / *** استخدم المفتاح العام لطرف واحد والمفتاح الخاص للطرف الآخر لإنشاء المفتاح المحلي* @RETURN* / public static byte [] generatelocalsecretkey (byte [] apublickey ، byte [] bprivatekey) يرمي الاستثناء {keyfactory keyfactory = keyfactory.getInstance ("dh") ؛ // استخدم مفتاحًا عامًا ، وإنشاء KeySpec ، واستخدم KeyFactory لإنشاء معلومات publickeke ذات الصلة x509encodedKeySpec KeySpec = جديد x509encodedKeySpec (apublickey) ؛ publickey publickey = keyfactory.generatepublic (keyspec) ؛ // استخدم مفتاحًا خاصًا ، وإنشاء معلومات ذات صلة من BKCS8ENCODEDEDEKESPEC PKCS8ENCODEDEDEKESPEC = جديد PKCS8ENCODEDEDKEYSPEC (BPRIVENKEY) ؛ PrivateKey PrivateKey = keyfactory.generateprivate (PKCS8ENCODEDEKEYSPEC) ؛ . keyagreement.init (privatekey) ؛ keyagreement.dophase (publickey ، true) ؛ return keyagreement.generateSecret ("AES"). // يمكن أيضًا استخدام الخوارزمية للحساب باستخدام الطريقة الافتراضية دون تحديد الخوارزمية} // الحصول على مفتاح البايت العام البايت البايت العام الثابت [] getPublicKey (map <string ، object> map) {return ((dhpublickey) map.get (public_key)). getencoded () ؛ } // احصل على مفتاح Byte Byte Public Static Byte [] GetPrivinKey (خريطة <سلسلة ، كائن> خريطة) {return ((dhPrivinKey) map.get (private_key)). getencoded () ؛ } static void main (string [] args) يلقي الاستثناء {byte [] source_public_key ؛ byte [] source_private_key ؛ byte [] source_local_key ؛ Byte [] target_public_key ؛ byte [] target_private_key ؛ byte [] target_local_key ؛ خريطة <string ، object> sourceKey = initsourceKey () ؛ Source_public_key = getPublicKey (sourceKey) ؛ source_private_key = getPrivateKey (sourceKey) ؛ System.out.println ("Source Public Key:"+bytestohex.frombyTestoHex (source_public_key)) ؛ System.out.println ("Source Private Key:"+bytestohex.frombyTestoHex (source_private_key)) ؛ خريطة <string ، object> targetKey = initTargetKey (getPublicKey (sourceKey)) ؛ Target_public_key = getPublicKey (TargetKey) ؛ Target_private_key = getPrivateKey (TargetKey) ؛ System.out.println ("Target Public Key:"+bytestohex.frombyTestoHex (Target_Public_key)) ؛ System.out.println ("المفتاح الخاص الهدف:"+bytestohex.frombyTestoHex (Target_Private_Key)) ؛ source_local_key = generatelocalsecretkey (target_public_key ، source_private_key) ؛ target_local_key = generatelocalsecretkeke (source_public_key ، target_private_key) ؛ System.out.println ("المصدر المحلي المفتاح:"+bytestohex.frombyTestoHex (source_local_key)) ؛ System.out.println ("Target Local Key:"+bytestohex.frombyTestoHex (Target_Local_Key)) ؛ }}【التشفير/فك التشفير (RSA) 】【 التوقيع الرقمي (RSA)】
خوارزمية RSA متأخرة عن خوارزمية DH ، وكل هذه الأحرف الخمسة هي الحروف الأولى للاسم الإنساني. خوارزمية DH هي أول نظام تشفير غير متماثل.
تحتوي خوارزمية RSA على سرعة حوسبة بطيئة وهي غير مناسبة لتشفير كميات كبيرة من البيانات. يتمثل أحد الحلول في مزج طرق التشفير RSA والتشفير المتماثل ، وتشفير البيانات باستخدام طرق التشفير المتماثل ، ومفاتيح التشفير المتماثل باستخدام خوارزميات RSA. لأن المفتاح قصير جدًا ، فإن الوقت ليس كثيرًا. في الواقع ، فإن العيب الوحيد لأساليب التشفير المتماثل هو أنه من الصعب تمرير المفتاح ، ومن الصعب أيضًا كسر طرق التشفير المتماثل.
السيناريوهات المعمول بها من RSA:
(1) يولد الخادم مفتاحًا عامًا ومفتاحًا خاصًا ، وينشر المفتاح العام.
(2) يستخدم العميل مفتاحًا عامًا لتشفير البيانات وتسليمها إلى الخادم. لا يمكن للآخرين فهم البيانات المشفرة.
(3) يستخدم الخادم مفتاحًا خاصًا لفك تشفير البيانات وعرض البيانات المقدمة من المستخدم.
في هذه الحالة ، يشبه المفتاح العام صندوق بريد ، ويمكن للجميع وضع رسالة في صندوق البريد هذا ، ولكن فقط أولئك الذين لديهم مفاتيح صندوق البريد يمكنهم إلغاء صناديق وعرض الحروف في صندوق البريد هذا.
السيناريو القابل للتطبيق RSA 2:
(1) يولد الإمبراطور مفتاحًا عامًا ومفتاحًا سريًا ، وينشر المفتاح العام.
(2) أصدر الإمبراطور مرسومًا لإبلاغ العالم. هناك سلاسلان من الأرقام في الزاوية اليمنى السفلى من المرسوم. السلسلة الأولى هي سلسلة عشوائية ، والسلسلة الثانية هي نتيجة تشفير السلسلة الأولى مع مفتاح خاص.
(3) لا يعتقد بعض الناس أن المرسوم كتبه الإمبراطور ، لذلك قاموا بفك تشفير السلسلة الثانية من الأرقام باستخدام المفتاح العام. بعد فك التشفير ، وجدوا أنه كان نفس السلسلة الأولى من الأرقام ، مما يعني أنه كتبه الإمبراطور بالفعل. نظرًا لأن معظم الأشخاص ليس لديهم مفتاح ، فلا يمكنهم تشفير البيانات التي يمكن فك تشفيرها مع المفتاح العام.
في هذه الحالة ، يتم استخدام المفتاح العام لفك التشفير ويتم استخدام المفتاح الخاص للتشفير. يمكن استخدام هذا لإثبات أن الإعلان قد أرسله شخص ما بالفعل. وهو ما يعادل توقيع.
في الواقع ، ليست هناك حاجة إلى أن تكون طويلة بشكل خاص للتوقيعات. بشكل عام ، التواقيع ثابتة الطول. إذا كنت ترغب في الحصول على طول ثابت ، فيمكنك استخدام خوارزمية MessagedIgest ، مثل MD5 و SHA Series. لذلك ، هناك مجموعة متنوعة من خوارزميات التوقيع ، مثل MD5 withrsa ، إلخ.
RSA تشفير/فك تشفير أمثلة
استيراد javax.crypto.cipher ؛ استيراد java.security.keypair ؛ استيراد java.security.keypairgenerator ؛ استيراد java.security.publickey ؛ import java.security.interfaces.rsaprivate ؛ java.util.map ؛/*** rsa أداة التشفير*/الفئة العامة rsautil {public static final string public_key = "rsa_public_key" ؛ Static Final String Private_Key = "RSA_PRIVAL_KEY" ؛ / ** * مفتاح التهيئة * RETURN * @Throws استثناء */ خريطة ثابتة عامة <String ، Object> initKey () يلقي الاستثناء {KEYPAIRGERERATOR KEYPAIRGERENTARATOR = KEYPAIRGERERATOR.GETINSTANCE ("RSA") ؛ keypairgenerator.initialize (1024) ؛ // 512-65536 ومضاعفات 64 KEYPAIR KEYPAIR = KEYPAIRGERERATOR.GENERATEKEYPAIR () ؛ rsapublickey publickey = (rsapublickey) keypair.getpublic () ؛ rsApRivateKey privatekey = (rsapRivateKey) keypair.getPrivate () ؛ خريطة <string ، object> keymap = new hashmap <string ، Object> () ؛ keymap.put (public_key ، publickey) ؛ keymap.put (private_key ، privatekey) ؛ إرجاع keymap ؛ } static rsapublickey getpublickey (خريطة <سلسلة ، كائن> keymap) {return (rsapublickey) keymap.get (public_key) ؛ } static static rsaprivatekey getPrivinKey (Map <String ، Object> keymap) {return (rsapRivaley) keymap.get (private_key) ؛ } / ** * تشفير البيانات باستخدام المفتاح العمومي * param data * param publickey * regurn * @throws استثناء * / بايت ثابت عام [] incrypt (byte [] data ، rsapublickey publickey) يلقي استثناء {cipher cipher.gethinstance ("rsa") ؛ cipher.init (cipher.encrypt_mode ، publickey) ؛ إرجاع cipher.dofinal (البيانات) ؛ } / ** * استخدم المفتاح الخاص لفك تشفير * param data * param privatekey * regurn * @throws استثناء * / بايت ثابت عام [] decrypt (byte [] data ، rsapRivaleKey privatekey) يلقي الاستثناء {cipher cipher.gethinstance ("rsa") ؛ cipher.init (cipher.decrypt_mode ، privatekey) ؛ إرجاع cipher.dofinal (البيانات) ؛ } public static void main (string [] args) يلقي الاستثناء {string data = "Jay Chou-Dongfeng Break" ؛ الخريطة <string ، Object> keymap = initKey () ؛ byte [] miwen = encrypt (data.getBytes () ، getPublicKey (keymap)) ؛ System.out.println ("المحتوى المشفر:"+bytestohex.frombytestohex (miwen)) ؛ byte [] plain = decrypt (miwen ، getPrivinKey (keymap)) ؛ System.out.println ("محتوى فك التشفير:"+سلسلة جديدة (عادي)) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.