خوارزميات التشفير المشتركة
خوارزمية التشفير في اتجاه واحد:
BASE64 بالمعنى الدقيق للكلمة ، فهو ينتمي إلى تنسيق الترميز ، وليس خوارزمية التشفير
MD5 (Messagedigestalgorithm5 ، خوارزمية هضم المعلومات)
SHA (SecureHashalgorithm ، خوارزمية تجزئة آمنة)
HMAC (HashMessageAuthenticationCode ، رمز مصادقة رسالة التجزئة)
تشفير متماثل معقد (DES ، PBE) ، خوارزميات التشفير غير المتماثلة:
DES (DataEncryptionstandard ، خوارزمية تشفير البيانات)
PBE (تعتمد على كلمة المرور ، بناءً على التحقق من كلمة المرور)
RSA (اسم الخوارزمية سميت باسم المخترع: رونريفيست ، عدي شامير وليونارد أدلمان)
DH (خوارزمية Diffie-Hellman ، بروتوكول الاتساق الرئيسي)
DSA (خوارزمية DigitalsIgnature ، التوقيع الرقمي)
ECC (تشفير المنحنيات الإهليلجية)
توقيع رقمي
وصف موجز للخوارزمية
يمكن اعتبار خوارزمية التوقيع الرقمي خوارزمية هضم الرسالة مع مفتاح ، وهذا المفتاح يحتوي على مفتاح عام ومفتاح خاص. وهذا يعني أن خوارزمية التوقيع الرقمي هي مزيج من خوارزمية التشفير غير المتماثلة وخوارزمية هضم الرسالة.
سمات
تتطلب خوارزميات التوقيع الرقمي القدرة على التحقق من تكامل البيانات ، ومصادقة مصادر البيانات ، ولعب دور في مقاومة الإنكار.
مبدأ
تتضمن خوارزمية التوقيع الرقمي عمليتين: التوقيع والتحقق ، يتبع أساليب التوقيع الرئيسي والتحقق من المفتاح العام.
عند التوقيع ، يجب استخدام المفتاح الخاص والبيانات المراد توقيعهم. عند التحقق ، يجب استخدام المفتاح العام وقيمة التوقيع والبيانات المراد توقيعها. الخوارزمية الأساسية هي بشكل أساسي خوارزمية هضم الرسالة.
1. ملخص الرسالة
سلسلة beforeDegist = "ASDF" ؛ System.out.println ("قبل" ملخص: "+beforedegist) ؛ // يجب تحويل المعلومات الأولية إلى بايت بايت بايت [] plaintext = beforeDegist.getBytes (" utf8 ") = messagedigest.getInstance ("sha-1") ؛ New String (messagedigest.digest () ، "utf8") ؛2. تشفير المفتاح الخاص
/*** هذا المثال هو تشفير معلومات سلسلة باستخدام مفتاح خاص ، ثم فك تشفيرها بالمفتاح الخاص للتحقق مما إذا كان ثابتًا. يتم تشفير المفتاح الخاص ، وهو تشفير متماثل* باستخدام خوارزمية متماثلة. على سبيل المثال: يستخدم A مفتاحًا لتشفير ملف ، ويحتاج B إلى نفس المفتاح الذي يشاركه الطرفان في مفتاح خاص * (وفي بيئة الويب ، يتم الاستماع إلى المفتاح الخاص بسهولة عند تمريره) * * المرفق: الخوارزميات المتماثلة الرئيسية هي: DES (المفتاح الفعلي فقط يستخدم 56 بت) */ <span style = "White-Space: pre ؛"> </span> string قبل = "ASDF" ؛ byte [] plaintext = quort.getBytes ("utf8") ؛ // الخطوة 1. system.out.println ("ابدأ إنشاء مفتاح AES.") ؛ // احصل على مثيل من keygenerator باستخدام خوارزمية AES keygenerator keygen = keygenerator.getInstance ("aes") ؛ keygen.generateKey () ؛ system.out.println ("الانتهاء من إنشاء ees key ="+key) ؛// الخطوة 2.
// احصل على مشفر من فئة التشفير الرئيسية ، وتحديد المعلومات الأساسية للتشفير: ECB هي طريقة التشفير ، و PKCS5Padding هي طريقة التعبئة الشفرات المشفرة = cipher.getinstance ("AES/ECB/PKCS5Padding") ؛ //system.out.println("/n " + cipher.getProvider (). getInfo ()) ؛// الخطوة 3.
// استخدم المفتاح الخاص لتشفير system.out.println ("/n تشفير مع المفتاح الخاص ...") ؛ // استخدم المفتاح الذي تم إنشاؤه للتو كمعلمة ، وتهيئة فئة التشفير باستخدام المفتاح الخاص الذي تم الحصول عليه الآن. cipher.encrypt_mode يعني التشفير cipher.init (cipher.encrypt_mode ، المفتاح) ؛ // يتم تشفير تشفير فئة تشفير المفتاح الخاص ، وبعد التشفير ، يتم تحويل دفق البايت في سلسلة utf8 [] String (ciphertext ، "utf8") ؛ system.out.println ("كاملة مع تشفير المفتاح الخاص:"+بعد 1) ؛// الخطوة 4.
[Java] عرض نسخة عادي // استخدم المفتاح الخاص لفك تشفير المعلومات المشفرة الآن فقط لمعرفة ما إذا كانت متسقة. cipher.decrypt_mode يعني نظام مفتاح فك التشفير. cipher.dofinal (ciphertext) ؛ سلسلة بعد 2 = سلسلة جديدة (newPlainText ، "utf8") ؛ system.out.println ("decrypted مع المفتاح الخاص:"+بعد 2) ؛3. تشفير المفتاح العام
السلسلة قبل = "ASDF" ؛ byte [] plaintext = قبل. keygen.initialize (1024) ؛ // إنشاء مفتاح من خلال keypairgenerator ، ملاحظة: المفتاح هنا هو زوج من المفاتيح! ! KEYPAIR KEY = KEYGEN.GENERATEKEYPAIR () ؛ // احصل على فئة RSA Cipher ، مشفرة باستخدام Cipher Cipher المفتاح العام = cipher.getinstance ("RSA/ECB/PKCS1Padding") ؛ // system.out.println ("/n" system.out.println ("/n مشفرة مع المفتاح العام ...") ؛ // cipher.encrypt_mode يعني التشفير ، احصل على المفتاح العام من زوج من المفاتيح. cipher.dofinal (plaintext) ؛ // تحويل دفق البايت إلى سلسلة في سلسلة تنسيق UTF8 بعد 1 = سلسلة جديدة (ciphertext ، "utf8") ؛ System.out.println ("استخدم تشفير المفتاح العام:"+بعد 1) ؛ // decrypt system.out.println ("/ndecrypt مع المفتاح الخاص ...") ؛ // cipher.decrypt_mod key.getPrivate ()) ؛ // decrypt مع المفتاح الخاص وإرجاع بايت بايت بايت [] newPlainText = cipher.dofinal (ciphertext) ؛ string بعد 2 = سلسلة جديدة (newPlainText ، "utf8") ؛ system.out.println ("decryption مع المفتاح الخاص:"+بعد 2) ؛4. التوقيع الرقمي
/*** هذا المثال مثال على التوقيع الرقمي. استخدم مفتاح RSA الخاص للتوقيع على Message Digest (هنا يشير إلى البيانات الأصلية) ، ثم استخدم المفتاح العام للتحقق من التوقيع * * A يقوم بتشفير البيانات بالمفتاح العام لـ B ويرسلها إلى B. B يستخدم المفتاح الخاص بـ B الخاص لفك تشفيره ، بل لا يمكن استخدام البيانات المطلوبة (لا يمكن استخدام البيانات المطلوبة عن Decrate. المفتاح العام لـ B لتشفير نسخة من البيانات وإرسالها إلى B. وبهذه الطريقة ، والسؤال هو ، هل البيانات التي تم استلامها بواسطة B؟ B ، وتحتاج إلى إعداد جزأين: 1 و 2 * 1: A يستخدم المفتاح العمومي الخاص بـ B لتشفير المعلومات الأصلية لتكون بمثابة سرية (يمكن إلغاء مفتاح B الخاص فقط لـ B ، لكن لا يمكن للآخرين فك المفاتيح الأخرى ، بالطبع ، إنها سرية) * 2: A يستخدم مفتاحًا خاصًا للتوقيع على المعلومات الأصلية للخدمة كمستقبل B. ثم تمريره إلى B. في الوقت نفسه ، يستخدم C المفتاح الخاص لـ C للتوقيع على أي معلومات إلى B. ما يريد B ما الذي يريده أن يكون بيانات A (مثل طلب النقل) ، لذلك يفكِل B * المعلومات المستلمة من خلال مفتاح A الخاص بـ A ، وما هو غير مغطى بـ A قبل. keygen.Initialize (1024) ؛ KEYPAIR KEY = KEYGEN.GENERATEKEYPAIR () ؛ // التوقيع مع المفتاح الخاص ************************************************* Signature Sig = signature.getInstance ("sha1withrsa") ؛ SIG.Initsign (key.getPrivate ()) ؛ // يحصل كائن SIG على المفتاح الخاص // كائن موقّع يحصل على البيانات الأصلية sig.update (plaintext) ؛ // sig كائن يحصل على البيانات الأصلية (في الواقع ، يتم استخدام Digest of the Origin يستخدم Sig.Sign () ؛ // sig Object المفتاح الخاص للتوقيع على البيانات الأصلية ، ويحصل على التوقيع بعد توقيع التوقيع em.out.println (sig.getProvider (). getInfo ()) ؛ سلسلة بعد 1 = سلسلة جديدة (توقيع ، "utf8") ؛ system.out.println ("/nsign مع المفتاح الخاص:"+بعد 1) ؛ // استخدم المفتاح العمومي للتحقق من sig.initverify (key.getpublic () ؛ (sig.verify (التوقيع)) {// sig object يفكّر التوقيع مع المفتاح العام للحصول على البيانات الأصلية (أي ، ملخص) ، إذا كان sustem.out.println ("التحقق من التوقيع صحيح !! {system.out.println ("فشل التحقق من التوقيع !!") ؛}5. الشهادة الرقمية
/*** هذا المثال عبارة عن عملية على ملف "الشهادة الرقمية"* يوفر لك منصة Java (تثبيت JDK على الجهاز) مفتاحًا (مكتبة الشهادة). يتم توفير أمر KeyTool ضمن CMD لإنشاء مكتبة الشهادة * * قبل تشغيل هذا المثال: * إنشاء شهادة في دليل C Disk ، وحدد مكتبة الشهادة لتكون Bocsoftkeylib ، وإنشاء شهادة مع asscertification الاسم المستعار. إنه يحدد أنه يتم إنشاؤه باستخدام خوارزمية * RSA ، وطول المفتاح هو 1024 ، والشهادة صالحة لمدة عام واحد * ملف شهادة التصدير هو tc.cer ، والذي يتم تخزينه بالفعل على شهادة القرص المحلي C:/ * كلمة المرور هي Qazzaq */try {// preparation: قم بتصدير شهادة من شهادة الشهادة إلى ملف الشهادة (مثال على ذلك). معلومات من ملف الشهادة tc.cer certificatefactory cf = certificatefactory.getInstance ("x.509") ؛ fileInputStream في = new FileInputStream ("c: /tc.cer") ؛ // اقرأ الملف في شهادة فئة الشهادة في شكل شهادة الدفق c = cf.generatificate (في) "+c.toString ()) ؛*// أو لا تستخدم طريقة الكود أعلاه ، اقرأ معلومات الشهادة مباشرة من مكتبة الشهادة ، والتي هي بالضبط نفس سلسلة pass = qazzaq ks = keystore.getInstance ("jks") ؛ ks.load (in2 ، pass.tochararray ()) ؛ string alias = "testCertification" ؛ // alias هي شهادة الاسم المستعار c = ks.getCertificate (alias) ؛ system.err.println ("معلومات الشهادة بعد التحويل: هذه فئة فرعية لفئة الشهادة للحصول على الشهادة ، وتنفيذ المزيد من الطرق x509Certificate t = (x509Certificate) c ؛ // استخراج المعلومات المطلوبة من نظام المعلومات. الرقم: "+t.getSerialNumber (). "+t.getnotbefore ()) ؛ system.out.println (" خوارزمية التوقيع: "+t.getSigalgname ()) ؛ byte [] sig = t.getSignature () ؛ // signature value publickey pk = t.getpublickey () ؛ byte [] pkenc = pk.getencoded () ؛ i = 0 ؛ i <pkenc.length ؛ i ++) {system.out.print (pkenc [i]+"،" ، ") التاريخ! ") ؛ // تحقق من صحة توقيع الشهادة وإصدار شهادة CA للعميل من خلال منظمة مركز الشهادة الرقمية (CA) ، مثل: caroot.crt file // ليس لدي الشهادة الصادرة لي من قبل CA ، لذلك لا يمكن تنفيذ الرمز التالي/*fileInputStream in3 = new FilePutStstre (" caroot.crt ") Cf.GenerateCerificate (IN3) System.out.println ("التحقق من صحة تاريخ الشهادة: منتهية الصلاحية") ؛ } catch (التحقق من صحة تاريخ الشهادة: منتهية الصلاحية ") ؛} catch (التحقق من صحة تاريخ الشهادة: منتهية الصلاحية") ؛ } catch (التحقق من صحة تاريخ الشهادة: منتهية الصلاحية ") ؛} catch (fileNotFoundException ce) {ce.printstacktrace () ؛} catch (fileNotfoundException fe) {fe.printstacktrace () ؛} /*catch (ioexception ioe) ه) {e.printstacktrace () ؛}}لخص
ما سبق هو كل شيء عن أمثلة الكود الكامل لتشفير Java وفك التشفير والتوقيعات الرقمية. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!