تتمثل التشفير في تغيير بيانات المعلومات الأصلية باستخدام خوارزمية خاصة ، بحيث حتى لو حصل مستخدم غير مصرح به على المعلومات المشفرة ، فلا يزال لا يستطيع فهم محتوى المعلومات لأنه لا يعرف طريقة فك التشفير. يتم تقسيمه عمومًا إلى تشفير في اتجاهين وتشفير في اتجاه واحد ، في حين ينقسم التشفير ثنائي الاتجاه إلى تشفير متماثل وتشفير غير متماثل (بعض المواد تقسم بشكل مباشر التشفير إلى التشفير المتماثل والتشفير غير المتماثل).
المعنى العام للتشفير ثنائي الاتجاه هو تكوين نص مشفر بعد تشفير النص العادي ، والذي يمكن استعادته إلى نص عادي من خلال الخوارزميات. لا يؤدي التشفير في اتجاه واحد إلا إلى حساب Digest على المعلومات ، ولا يمكن أن ينشئ نصًا عاديًا من خلال الخوارزميات. بالمعنى الدقيق للكلمة ، لا يمكن اعتبار التشفير أحادي الاتجاه نوعًا تشفيرًا ، ولكن ينبغي اعتباره خوارزمية هضم.
خاصة:
يجب أن يكون النظام متاحًا ولا يمكن فك تشفيره غير مائي.
لا يجب أن يظل النظام سريًا ويمكن أن يسقط بسهولة في أيدي العدو.
يجب تبادل المفتاح وحفظه دون كتابة ، ويمكن للطرفين تغيير المفتاح.
يمكن استخدام النظام للاتصالات السلكية واللاسلكية.
يمكن للنظام نقل المواقف ، ويجب تحقيق وظائفه دون المرور عبر العديد من الأشخاص.
النظام سهل الاستخدام ولا يتطلب أن يكون المستخدم مرهقًا أو لديه العديد من القواعد.
1. مزود رمز طريقة التشفير الرئيسي
JDK: الكود في حزمة JRE/LIB/JCE.JAR في دليل تثبيت Java ؛
CC: org.apache.commons.codec المقدمة من Apache
الصفحة الرئيسية: http://commons.apache.org/proper/commons-codec/
قبل الميلاد: org.bouncecastle
الصفحة الرئيسية: http://www.bouncycastle.org/java.html
بشكل أساسي يستخدم JDK بشكل شائع.
2. BASE64 خوارزمية
1. انطلاقًا من تعقيد خوارزمية التشفير الآن ، فإن BASE64 محرج للقول إنه مشفر ، لكنه يكفي للأشخاص الذين لا يفهمون أجهزة الكمبيوتر على الإطلاق. الترميز BASE64 غير قابل للقراءة ، أي أن البيانات المشفرة لن ينظر إليها مباشرة من قبل البشر بالعين المجردة.
يتم استخدام ترميز BASE64 بشكل عام لمعالجة عناوين URL ، أو أي شيء لا تريد أن يعرفه الأشخاص العاديون في لمحة يمكن معالجتها باستخدام BASE64 الترميز ثم نشرها على الإنترنت.
package com.amuro.strategy.base64 ؛ import java.util.base64 ؛ import com.amuro.strategy.istrategy ؛/** ** * base64 يعتمد خوارزمية BASE64 على 64 حرفًا أساسيًا ، ويتم تضمين هذه الأحرف الـ 64 (string src) (string src) ( byte [] encodebytes = base64.getenCoder (). encode (src.getBytes ()) ؛ إرجاع سلسلة جديدة (encodeBytes) ؛ } decode string public (سلسلة src) {byte [] decodeBytes = base64.getDecoder (). decode (src.getBytes ()) ؛ إرجاع سلسلة جديدة (decodeBytes) ؛ }}2. جدول مراسلات ترميز BASE64
3. خوارزمية هضم الرسالة (هضم الرسالة)
يسمى Message Digest أيضًا Digital Digest. إنها قيمة فريدة تتوافق مع طول ثابت من رسالة أو نص ، ويتم إنشاؤه بواسطة وظيفة تشفير التجزئة أحادية الاتجاه تعمل على الرسالة. تتيح مقاومة الصراع لوظيفة التجزئة أن تتغير نص عادي قليلاً ، حتى لو تم تغيير حرف واحد فقط من الفقرة ، سيتم إنشاء قيم مختلفة بعد خوارزمية التجزئة. إن أحادي الاتجاه لخوارزمية التجزئة يجعل من المستحيل العثور على رسالتين إدخالين مختلفين مع نفس قيمة التجزئة حسابيًا. لذلك ، فإن قيمة التجزئة للبيانات ، أي هضم الرسالة ، يمكنها التحقق من سلامة البيانات.
بكلمات واضحة ، يجب أن تكون أي جزء من البيانات فريدة من نوعها مثل الإنسان. ما هو المعرف الفريد؟ بالنسبة للبشر ، فهي حاليًا بصمات الأصابع ، وما هي بصمة البيانات؟ هذا صحيح ، إنها هذه السلسلة التي تم إنشاؤها بواسطة خوارزمية Message Digest. على سبيل المثال ، عندما نقوم بتسجيل موقع ويب ، يقوم العميل بنقل كلمة المرور التي أدخلناها إلى الخادم ، والتي يجب أن تكون المحتوى بعد معالجة Message Digest. حتى إذا تم كسر الخادم ، فلن يتمكن Hack من معرفة كلمة المرور الحقيقية للمستخدم. ومع ذلك ، يقال أن MD5 و SHA قد تعرضوا للخطر الآن ، حتى تتمكن من Google.
1. MD5
package com.amuro.strategy.message_digest ؛ import java.security.messagedigest ؛ استيراد java.security.nosuchalgorithmexception ؛ import org.apache.commons.codec.binary.hex ؛ استيراد com.amuro.strategy.istrategy ؛ MD5strategy تنفس ISTrategy {public string encode (String src) {try {messagedigest md = messagedigest.getInstance ("md5") ؛ byte [] encodeBytes = md.digest (src.getBytes ()) ؛ إرجاع hex.encodeHexString (encodeBytes) ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ } إرجاع فارغ ؛ } decode public string decode (string src) {رمي new runTimeException ("md5 no decode") ؛ }}2. شا
package com.amuro.strategy.message_digest ؛ import java.security.messagedigest ؛ استيراد java.security.nosuchalgorithMexcept تنفذ shastrategy isrategy {public string encode (String src) {try {messagedigest md = messagedigest.getInstance ("sha") ؛ md.update (src.getBytes ()) ؛ إرجاع hex.encodeHexString (Md.Digest ()) ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ } إرجاع فارغ ؛ } decode public string decode (String SRC) {رمي new RunTimeException ("sha no decode") ؛ }} 4. التشفير المتماثل <BR /> باستخدام طريقة التشفير لنظام التشفير من مفتاح واحد ، يمكن استخدام نفس المفتاح كتشفير وفك تشفير المعلومات في نفس الوقت. تسمى طريقة التشفير هذه التشفير المتماثل ، والمعروفة أيضًا باسم تشفير المفتاح الواحد. نظرًا لأن كل من التشفير وفك التشفير يستخدمان نفس المفتاح ، فإن كيفية تمرير مفتاح Decryptor بأمان تصبح مشكلة يجب حلها. بطبيعة الحال ، فإن مزايا انخفاض الأمان هي حجم حساب صغير وسرعة التشفير السريع وكفاءة التشفير العالية.
ومع ذلك ، توقفت أجهزة الكمبيوتر الحديثة منذ فترة طويلة عن الاهتمام بهذا المستوى من الحوسبة ، والسلامة هي أهم شيء.
1. ديس
DES ، الاسم الكامل هو "معيار تشفير البيانات" ، واسمها الصيني هو "معيار تشفير البيانات" ، هو خوارزمية كتلة تستخدم تشفير المفاتيح. خوارزمية DES هي نظام تشفير متماثل في نظام التشفير ، والمعروف أيضًا باسم معيار تشفير البيانات الأمريكي. إنها خوارزمية تشفير نظام تشفير متماثل تم تطويرها من قبل IBM في الولايات المتحدة في عام 1972. يتم تجميع النص العادي بمقدار 64 بت ، والمفتاح هو في الواقع طريقة تشفير 56 بت التي تشارك في عملية DES (8 ، 16 ، 24 ، 32 ، 40 ، 48 ، 56 ، 64 بت هي BITs. استبدال بت أو تبادل لتشكيل طريقة التشفير لمجموعة النص المشفر.
package com.amuro.strategy.des ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.keygenerator ؛ استيراد javax.crypto.secretke com.amuro.strategy.istrategy ؛/** * * Author amuro * */public class dessrategy isrategy {private cipher cipher ؛ SecretKey الخاص encode public string (String src) {try {keygenerator keygenerator = keygenerator.getInstance ("des") ؛ keygenerator.init (56) ؛ // size secretkey secretKey = keygenerator.generateKey () ؛ byte [] keybytes = secretKey.getenCoded () ؛ deskeyspec deskeyspec = جديد deskeyspec (keybytes) ؛ SecretKeyFactory secretKeyFactory = secretKeyFactory.getInstance ("des") ؛ cenerteKey = secretKeyFactory.GenerateSecret (deskeyspec) ؛ cipher = cipher.getInstance ("des/ecb/pkcs5padding") ؛ cipher.init (cipher.encrypt_mode ، cenertekey) ؛ byte [] resultBytes = cipher.dofinal (src.getBytes ()) ؛ إرجاع hex.encodeHexString (resultBytes) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } decode السلسلة العامة (سلسلة src) {try {cipher.init (cipher.decrypt_mode ، cenderatekey) ؛ byte [] result = Hex.DecodeHex (src.tochararray ()) ؛ إرجاع سلسلة جديدة (cipher.dofinal (نتيجة)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }}2. 3Des3des ، المعروف أيضًا باسم "Triple des" ، يسمى "خوارزمية تشفير البيانات الثلاثي" ، والتي تعادل تطبيق خوارزمية تشفير DES ثلاث مرات لكل كتلة بيانات. نظرًا لقوة حوسبة الكمبيوتر المحسّنة ، أصبح طول مفتاح كلمة المرور الأصلية DES SPOWIRE سهلة الغشاش ؛ تم تصميم 3Des لتوفير طريقة بسيطة نسبيًا لتجنب هجمات مماثلة من خلال زيادة الطول الرئيسي لـ DES ، بدلاً من تصميم خوارزمية تشفير بلوك جديدة.
package com.amuro.strategy.des ؛ import javax.crypto.cipher ؛ import javax.crypto.keygenerator ؛ import javax.crypto.secretke org.apache.commons.codec.binary.hex ؛ استيراد com.amuro.strategy.istrategy ؛ الطبقة العامة _3dessrategy تنفس isrategy {private cipher cipher ؛ SecretKey الخاص Encode string public (سلسلة src) {try {keygenerator keygenerator = keygenerator.getInstance ("desede") ؛ keygenerator.init (168) ؛ // size secretKey SecretKey = KeyGenerator.generateKey () ؛ byte [] keybytes = secretKey.getenCoded () ؛ DeseedeKeySpec deskeyspec = جديد deseedekeyspec (keybytes) ؛ secretKeyFactory secretKeyFactory = secretKeyFactory.getInstance ("desede") ؛ cenerteKey = secretKeyFactory.GenerateSecret (deskeyspec) ؛ cipher = cipher.getInstance ("desede/ecb/pkcs5padding") ؛ cipher.init (cipher.encrypt_mode ، cenertekey) ؛ byte [] resultBytes = cipher.dofinal (src.getBytes ()) ؛ إرجاع hex.encodeHexString (resultBytes) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } decode السلسلة العامة (سلسلة src) {try {cipher.init (cipher.decrypt_mode ، cenderatekey) ؛ byte [] result = Hex.DecodeHex (src.tochararray ()) ؛ إرجاع سلسلة جديدة (cipher.dofinal (نتيجة)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }}3. AESAES ، الاسم الكامل هو "Advanced Encryption Standard" ، الاسم الصيني هو "Advanced Encryption Standard". ومن المعروف أيضًا باسم طريقة تشفير Rijndael في التشفير. إنه معيار تشفير كتلة اعتمدته الحكومة الفيدرالية الأمريكية. كجيل جديد من معايير تشفير البيانات ، تجمع خوارزمية تشفير AES مزايا الأمن القوي والأداء العالي والكفاءة العالية وسهولة الاستخدام والمرونة. يحتوي تصميم AES على ثلاثة أطوال مفتاح: 128 ، 192 ، 256 بت. نسبيا ، فإن مفتاح 128 من AES أقوى 1021 مرة من مفتاح DES 56.
package com.amuro.strategy.des ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.keygenerator ؛ استيراد javax.crypto.secretkeke ؛ AESSTRETGY ينفذ ISTERTEGY {cipher cipher. SecretKey الخاص encode public string (String SRC) {try {keygenerator keygenerator = keygenerator.getInstance ("aes") ؛ keygenerator.init (128) ؛ // size secretKey SecretKey = KeyGenerator.generateKey () ؛ byte [] keybytes = secretKey.getenCoded () ؛ cenertekey = new SecretKeySpec (keybytes ، "aes") ؛ cipher = cipher.getInstance ("AES/ECB/PKCS5Padding") ؛ cipher.init (cipher.encrypt_mode ، cenertekey) ؛ byte [] resultBytes = cipher.dofinal (src.getBytes ()) ؛ إرجاع hex.encodeHexString (resultBytes) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } decode السلسلة العامة (سلسلة src) {try {cipher.init (cipher.decrypt_mode ، cenderatekey) ؛ byte [] result = Hex.DecodeHex (src.tochararray ()) ؛ إرجاع سلسلة جديدة (cipher.dofinal (نتيجة)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }} 4. PBE
PBE ، الاسم الكامل "تشفير قاعدة كلمة المرور" ، هو خوارزمية تشفير تستند إلى كلمة المرور. خاصتها هي أن كلمات المرور تستخدم بدلاً من المفاتيح ، ويتم إدارة كلمة المرور من قبل المستخدم نفسه. قام عدد عشوائي بتجميع التشفير المتعدد وطرق أخرى لضمان أمان البيانات.
لا تحتوي خوارزمية PBE على مفهوم المفتاح ، وتعامل كلمة المرور كمفتاح. نظرًا لأن طول المفتاح يؤثر على أمان الخوارزمية وهو غير مناسب للذاكرة ، فهذا يختلف تمامًا بالنسبة لنا لاستخدام كلمة المرور التي نستخدمها هنا مباشرةً ، وهي مريحة لذاكرتنا. ومع ذلك ، يتم استنفاد كلمات المرور البسيطة بسهولة بواسطة أساليب القاموس ، لذلك أضفنا بعض "الملح" إلى كلمة المرور هنا. من الصعب كسر هذا المزيج من الملح وكلمات المرور. في الوقت نفسه ، نقوم بدمج الملح وكلمة المرور ونتكرر مرات عديدة مع خوارزمية هضم الرسالة لبناء المواد الأساسية لمتجه التهيئة الرئيسية ، مما يجعل فك التشفير أكثر صعوبة.
package com.amuro.strategy.pbe ؛ import java.security.securerandom ؛ import javax.crypto.cipher ؛ import javax.crypto.secretkey ؛ import javax.crypto.secretke javax.crypto.spec.pbepeparameterspec ؛ استيراد org.apache.commons.codec.binary.hex ؛ استيراد com.amuro SecretKey الخاص pebeparameterspec pebeparameterspec الخاص ؛ encode string public encode (String src) {try {Securerandom SecurerAndom = new SecurerAndom () ؛ Byte [] SALT = SECURERANDOM.GERENTESEED (8) ؛ سلسلة كلمة المرور = "amuro" ؛ pbekeyspec pbekeyspec = new pbekeyspec (password.tochararray ()) ؛ secretKeyFactory secretKeyFactory = secretKeyFactory.getInstance ("pbewithmd5anddes") ؛ cenerteKey = secretKeyFactory.GenerateSecret (pbekeyspec) ؛ pebeparameterspec = pbepparameterspec جديد (ملح ، 100) ؛ cipher = cipher.getInstance ("pbewithmd5anddes") ؛ cipher.init (cipher.encrypt_mode ، cenertekey ، pebeparameterspec) ؛ byte [] resultBytes = cipher.dofinal (src.getBytes ()) ؛ إرجاع hex.encodeHexString (resultBytes) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } decode string public (سلسلة src) {try {cipher.init (cipher.decrypt_mode ، cenderatekey ، pebeparameterspec) ؛ byte [] result = Hex.DecodeHex (src.tochararray ()) ؛ إرجاع سلسلة جديدة (cipher.dofinal (نتيجة)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }} 5. التشفير غير المتماثل <BR /> يتطلب خوارزمية التشفير غير المتماثلة مفتاحين لتشفير وفك التشفير ، وهما المفتاح العام والمفتاح الخاص. شيء واحد يجب ملاحظته هو أن المفتاح العام والمفتاح الخاص يجب أن يكونان زوجًا. إذا تم تشفير البيانات باستخدام المفتاح العام ، فيمكن فك تشفير المفتاح الخاص المقابل فقط ، والعكس صحيح. نظرًا لأن التشفير وفك التشفير يستخدمان مفتاحين مختلفين ، فإن هذه الخوارزمية تسمى خوارزمية التشفير غير المتماثل.
1. RSA
في الواقع ، ظهرت RSA في وقت مبكر من عام 1978 ، وكانت أول خوارزمية يمكن استخدامها في كل من تشفير البيانات والتوقيعات الرقمية. من السهل فهمها وتشغيلها وهي أيضًا تحظى بشعبية كبيرة. المبدأ كما هو موضح في عملية العمل أعلاه. تعتمد خوارزمية RSA على حقيقة نظرية الأرقام البسيطة للغاية: من السهل مضاعفة رقمين كبيرتين ، ولكن من الصعب للغاية عوامل منتجاتها ، بحيث يمكن الكشف عن المنتج كمفتاح تشفير.
package com.amuro.strategy.asymmetric ؛ استيراد java.security.keyfactory ؛ استيراد java.security.keypair ؛ استيراد java.security.keypairgenerator ؛ استيراد java.security.privinkey ؛ استيراد java.security.publickey java.security.interfaces.rsapublickey ؛ استيراد java.security.spec.pkcs8encodedkeyspec ؛ استيراد java.security.spec.x50 RSastrategy ينفذ isrategy {private rsapublickey rsapublickey ؛ RSAPRivatekey RSAPRIVYKEY ؛ encode string public encode (String src) {try {// تهيئة مفتاح keypairgenerator keypairgenerator = keypairgenerator.getInstance ("rsa") ؛ keypairgenerator.initialize (512) ؛ keypair keypair = keypairgenerator.generatekeypair () ؛ rsapublickey = (rsapublickey) keypair.getPublic () ؛ rsApRivateKey = (rsapRivateKey) keypair.getPrivate () ؛ . keyfactory keyfactory = keyfactory.getInstance ("RSA") ؛ PrivateKey PrivateKey = keyfactory.generateprivate (PKCS8ENCODEDEKEYSPEC) ؛ cipher cipher = cipher.getInstance ("RSA") ؛ cipher.init (cipher.encrypt_mode ، privatekey) ؛ byte [] resultBytes = cipher.dofinal (src.getBytes ()) ؛ // مفتاح خاص فك تشفير المفتاح العمومي // x509encodedKeySpec x509encodedKeySpec = // new x509encodedkeyspec (rsapublic.getencoded ()) ؛ // keyfactory keyfactory = keyfactory.getInstance ( keyfactory.generatepublic (x509encodedkeyspec) ؛ // cipher cipher = cipher.getinstance ("rsa") ؛ // cipher.init (cipher.encrypt_mode ، publickey) ؛ // byte [] resultbytes = cipher.dofinal إرجاع hex.encodeHexString (resultBytes) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } فك تشفير السلسلة العامة (سلسلة SRC) {try {// مفتاح خاص تشفير المفتاح العام decryption x509encodedKeySpec x509encodedKeySpec = new x509encodedkeyspec (rsapublickey.getencoded ()) ؛ keyfactory keyfactory = keyfactory.getInstance ("RSA") ؛ publickey publickey = keyfactory.generepublic (x509encodedKeySpec) ؛ cipher cipher = cipher.getInstance ("RSA") ؛ cipher.init (cipher.decrypt_mode ، publickey) ؛ byte [] resultBytes = cipher.dofinal (Hex.DecodeHex (src.tochararray ())) ؛ // مفتاح خاص فك تشفير المفتاح العمومي // pkcs8encodedKeySpec PKCS8ENCODEDEDEKESPEC // = جديد PKCS8ENCODEDEDEDKEYSPEC (rSAPRIVATEKEY.GETENCEDED () keyfactory.generateprivate (pkcs8encodedkeyspec) ؛ // cipher cipher = cipher.getinstance ("rsa") ؛ // cipher.init (cipher.decrypt_mode ، privatekey) ؛ إرجاع سلسلة جديدة (resultbytes) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }} 2. خوارزمية DH
DH ، الاسم الكامل "Diffie-Hellman" ، هو طريقة لضمان أن المفتاح المشترك يعبر بأمان شبكات غير آمنة ، والتي تسمى غالبًا بروتوكول الإجماع الرئيسي. فكرة اقترحها Diffie و Hellman ، مؤسسي نظام التشفير الرئيسي. ببساطة ، هو السماح لمستخدمين بتبادل المعلومات على الوسائط العامة لإنشاء مفاتيح "متسقة" وقابلة للمشاركة. وهذا يعني أن الحزب أ ينتج زوجًا من المفاتيح (المفتاح العام ، والمفتاح الخاص) ، ويقوم الحزب ب بإنشاء الزوج الرئيسي (المفتاح العام ، المفتاح الخاص) بناءً على المفتاح العام للحزب أ.
مع مراعاة هذا الأساس كأساس لسرية نقل البيانات ، يستخدم كلا الطرفين نفس خوارزمية التشفير المتماثل لبناء مفتاح محلي (SecretKey) لتشفير البيانات. وبهذه الطريقة ، بعد أن تكون خوارزمية المفتاح المحلي (SecretKey) قابلة للتشغيل ، الكشف عن الحزب A والحزب ب عن مفاتيحهم العامة ، وترميز البيانات باستخدام المفتاح العام للطرف الآخر والمفتاح الخاص الذي تم إنشاؤه للتو ، وفي الوقت نفسه ، يمكنهم استخدام المفتاح العام للطرف الآخر ومفتاحه الخاص لتشكيل البيانات. ليس فقط الطرفين A و B ، بل يمكن توسيعهما إلى اتصالات البيانات المشتركة متعددة الأحزاب ، والتي تكمل الاتصالات الآمنة للبيانات التفاعلية للشبكة!
package com.amuro.strategy.asymmetric ؛ استيراد java.security.keyfactory ؛ استيراد java.security.keypair ؛ استيراد java.security.keypairgenerator ؛ استيراد java.security.privinkey java.util.objects ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.keyagreement ؛ استيراد javax.crypto.secretke org.apache.commons.codec.binary.hex ؛ استيراد com.amuro.strategy.istrategy ؛ الطبقة العامة dhstrategy تنفس isrategy {private cipher cipher ؛ secretkey الخاص reciversecretkeke ؛ encode string public encode (String src) {try {// initial sender keypairgenerator senderkeypairgenerator = keypairgenerator.getInstance ("dh") ؛ senderkeypairgenerator.initialize (512) ؛ keypair senderkeypair = senderkeypairgenerator.generatekeypair () ؛ privateKey senderPrivateKey = senderkeypair.getPrivate () ؛ Byte [] SenderPublicKeybytes = senderkeypair.getPublic (). x509encodedKeySpec x509encodedKeySpec = جديد x509encodedKeySpec (senderpublickeybytes) ؛ publickey المتلقي QuactiverPublicKey = requiverKeyfactory.generatepublic (x509encodedKeySpec) ؛ dhparameterspec dhparameterspec = ((dhpublickey) المتلقي QuaritivePublickey) .getParams () ؛ keypairgenerator requiverkeypairgenerator = keypairgenerator.getInstance ("DH") ؛ requiverkeypairgenerator.initialize (dhparameterspec) ؛ keypair requiverkeypair = requiverkeypairgenerator.generatekeypair () ؛ privatekey requiverprivatekey = requiverkeypair.getPrivin () ؛ byte [] requiverpublickeybytes = requiverkeypair.getPublic (). getencoded () ؛ keyagreement reciverKeyagreement = keyagreement.getInstance ("DH") ؛ requiverKeyagreement.init (ReceiverPrivatekey) ؛ requiverkeyagreement.dophase (Receverppublickey ، true) ؛ reciversecretkey = reciverKeyagreement.generateSecret ("des") ؛ // يمكن للمرسل تشفيره عن طريق الحصول على مفتاح المتلقي العام. keyfactory senderKeyFactory = keyfactory.getInstance ("dh") ؛ X509EncodEdKeySpec = جديد X509EncodEdKeySpec (ReceverppublicKeybytes) ؛ publickey senderpublickey = senderKeyfactory.generatepublic (x509encodedKeySpec) ؛ keyagreement senderKeyagreement = keyagreement.getInstance ("dh") ؛ SenderKeyagreement.init (SenderPrivateKey) ؛ SenderKeyagreement.dophase (SenderPublicKey ، true) ؛ SecretKey sendersecretkey = senderKeyagreement.generateSecret ("des") ؛ if (objects.equals (reciversecretkey ، sursersecretkey)) {cipher = cipher.getInstance ("des") ؛ cipher.init (cipher.encrypt_mode ، sursersecretkey) ؛ byte [] result = cipher.dofinal (src.getBytes ()) ؛ إرجاع hex.encodeHexString (نتيجة) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } decode string public (سلسلة src) {try {cipher.init (cipher.decrypt_mode ، reciversecretkey) ؛ byte [] result = Hex.DecodeHex (src.tochararray ()) ؛ إرجاع سلسلة جديدة (cipher.dofinal (نتيجة)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }} 6. التشفير غير المتماثل لشهادات التوقيع الرقمي آمن بالفعل ، ولكن هناك عيب آخر:
خادم A نشر مفتاحه العام. قام جهاز الكمبيوتر الخاص بي بتشفير البيانات باستخدام مفتاح الخادم A الخاص بالخادم A ثم أرسله إلى الخادم A. في هذا الوقت ، قام الخادم B بغزو جهاز الكمبيوتر الخاص بي واستبدل المفتاح العام الذي اعتدت عليه لتشفيره بمفتاحه العام ، وبالتالي سيتم تصدع البيانات التي أرسلتها بواسطة المفتاح الخاص للخادم B. كيف تمنع المفتاح العام من العبث به؟
نعم ، فكرنا في ملخص الرسالة السابق. عندما ألقى الخادم A المفتاح العام لي ، ذهب أيضًا إلى CA للتقدم للحصول على شهادة رقمية. في الواقع ، إنه ملخص رسالة للمفتاح العام. مع هذه الشهادة ، عندما أقوم بتشفيرها بالمفتاح العام ، يمكنني أولاً التحقق مما إذا كان المفتاح العام الحالي قد تم تأكيده ليتم إرساله إلي بواسطة الخادم A.
هنا نوع من RSA:
package com.amuro.strategy.signature ؛ استيراد java.security.keyfactory ؛ استيراد java.security.keypair ؛ استيراد java.security.keypairgenerator java.security.interfaces.rsapublickey ؛ استيراد java.security.spec.pkcs8encodedkeyspec keypairgenerator.getInstance ("RSA") ؛ keypairgenerator.initialize (512) ؛ keypair keypair = keypairgenerator.generatekeypair () ؛ publickey rsapublickey = (rsapublickey) keypair.getPublic () ؛ privateKey rsapRivateKey = (rsapRivateKey) Keypair.getPrivate () ؛ PKCS8ENCODEDKEYSPEC PKCS8ENCODEDEKESPEC = جديد PKCS8ENCODEDEDEKESPEC (RSAPRIVATEKEY.GETENCODED ()) ؛ keyfactory keyfactory = keyfactory.getInstance ("RSA") ؛ PrivateKey PrivateKey = keyfactory.generateprivate (PKCS8ENCODEDEKEYSPEC) ؛ توقيع التوقيع = signature.getInstance ("md5withrsa") ؛ Signature.Initsign (PrivateKey) ؛ signature.update (src.getBytes ()) ؛ // إنشاء بايت بايت توقيع بايت [] signbytes = signature.sign () ؛ x509encodedKeySpec X509EncodeDeDekySpec = جديد X509EncodEdKeySpec (rsapublickey.getencoded ()) ؛ keyfactory = keyfactory.getInstance ("RSA") ؛ publickey publickey = keyfactory.generepublic (x509encodedKeySpec) ؛ Signature = signature.getInstance ("MD5Withrsa") ؛ Signature.InitVerify (publickey) ؛ signature.update (src.getBytes ()) ؛ Boolean Isverified = signature.verify (signbytes) ؛ عودة isverified. } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع خطأ ؛ }} فيما يتعلق باستخدام التواقيع الرقمية وخوارزميات التشفير غير المتماثلة ، رأيت أيضًا مثالًا رائعًا ، وسأشاركها معك:
للأسف ، اشتريت الكثير من الكتب هذا الشهر ولا يمكنني إخراجها حتى نهاية الشهر. صادفت أن ألتقي كلارك على QQ:
1-2-3: "كلارك ، أحتاج إلى 200 Tael Silver ، هل يمكنني إقراضه لي؟"
كلارك: "لا مشكلة. سأقوم بتحويل الأموال لك الآن. من فضلك أعطني IOU."
1-2-3: "شكرًا جزيلاً لك. سأكتب لك كلمة".
بعد ذلك ، قمت بإنشاء وثيقة كلمة جديدة ، وكتبت IOU ، وحفظتها. ثم ماذا علي أن أفعل؟ لا يمكنني إرسال IOU مباشرة إلى Clark لأسباب:
1. لا يمكنني ضمان أن كلارك لن يغير "200 تيلز من الفضة" إلى "2000 Taels of Silver" بعد تلقي IOU.
2. إذا فاتني الدين ، لا يمكن أن يثبت كلارك أنني كتبت IOU.
3. لا يمكن استخدام مستندات الكلمات العادية كدليل على الدعاوى القضائية.
لحسن الحظ ، لقد تقدمت بطلب للحصول على شهادة رقمية. قمت أولاً بتشفير IOU بمفتاحي الخاص ، ثم أرسل النص المشفر إلى Clark في QQ. بعد أن تلقى Clark النص المشفر لـ IOU ، قام بتنزيل المفتاح العام الخاص بي على موقع الويب الخاص بمركز شهادة الشهادة الرقمية ، ثم استخدم مفتاحي العام لفك تشفير النص المشفر. وجد أنه قد تم كتابته بالفعل باسم "200 Taels من الفضة المقترضة" ، حتى يتمكن كلارك من إقراض المال بثقة. لن أقلق من أن كلارك سيتغير مع IOU الخاص بي ، لأن:
1. منذ النص المشفر الذي أرسلته إلى كلارك ، لا يمكن لكلارك تعديله. يمكن لـ Clark تعديل IOU المنقطع التشفير ، لكن كلارك ليس لديه مفتاحي الخاص ، لذلك لا يمكن أن يقلد لي تشفير IOU. وهذا ما يسمى العبث.
2. نظرًا لأن IOU مشفرة بمفتاحي الخاص ، فهناك فقط مفاتيحي العامة التي يمكن فك تشفيرها. على العكس من ذلك ، يجب تشفير IOU التي يمكن فك تشفيرها من خلال مفتاحي العام مع مفتاحي الخاص ، ولا أملك سوى مفتاحي الخاص ، لذلك يمكن أن يثبت كلارك أن هذا IOU قد كتب من قبلي. وهذا ما يسمى مكافحة ديبوت.
3. إذا ظللت لا أتعامل مع الأموال ، فقد رفعني كلارك دعوى قضائية ضد المحكمة ، ويمكن استخدام وثيقة الكلمة المشفرة بمفتاحي الخاص كشهادة Cheng Tang. لأن بلدنا أصدرت "قانون التوقيع الإلكتروني لجمهورية الصين الشعبية" ، مما يجعل التوقيعات الرقمية فعالة قانونًا.
يجب أن تكون قد لاحظت أن هذا IOU الذي تم تشفيره بمفتاحي الخاص لديه خصائص العبث ومضاد لـ DEBT ، ويمكن استخدامها كشهادة Chengtang ، والتي هي نفس تأثير "التوقيع" على هذا IOU. بالمناسبة ، تسمى عملية "تشفير IOUS مع مفتاحي الخاص" التوقيع الرقمي.
هذا مقال موجز ، يكتب بعض تقنيات تشفير Java شائعة الاستخدام والرمز الأساسي هنا للرجوع إليه من قبل الأصدقاء.