تصف هذه المقالة وظائف التشفير وفك التشفير التي تنفذها JAVA استنادًا إلى خوارزمية التشفير المتماثل. شاركه للرجوع إليه ، على النحو التالي:
الفئات ذات الصلة بالتشفير:
Securerandom ورثت من فئة java.util.random
هناك ثلاثة أنواع من منشئو هذه الفئة ، فيما يلي مثالان:
SecurerAndom () يبني مولد الأرقام العشوائية الآمن (RNG) الذي ينفذ خوارزمية الرقم العشوائي الافتراضي.
SecurerAndom (بايت [] البذور) يبني مولد رقم عشوائي آمن (RNG) الذي ينفذ خوارزمية الرقم العشوائي الافتراضي.
يتم استخدام DeskeySpec لإنشاء محتوى المفتاح للمفتاح باستخدام المفتاح الأصلي.
لدى Deskeyspec مُنشئين:
يقوم DeskeySpec (مفتاح Byte []) بإنشاء كائن DeskeySpec باستخدام البايتات الـ 8 الأولى في المفتاح كمحتوى رئيسي لمفتاح DES.
يقوم Deskeyspec (مفتاح البايت [] ، INT) بإنشاء كائن deskeyspec ، باستخدام البايتات الـ 8 الأولى في المفتاح الذي يبدأ ويحتوي على إزاحة كمحتوى رئيسي لمفتاح DES-EDE.
SecretKeyFactory ، مصنع رئيسي يستخدم لتحويل مفتاح (مفتاح تشفير Opic من مفتاح النوع) إلى مواصفات رئيسية (تمثيل شفاف للمواد الرئيسية الأساسية) ، والعكس بالعكس. يعمل مصنع المفتاح السري فقط على مفاتيح Secret (متماثلة).
كائن SecretKey ، كائن المفتاح السري ، ينشئ مفتاحًا سريًا عن طريق استدعاء طريقة السطح المكتبي المولد (DeskeySpec) للمصنع المفتاح السري
توفر فئة Cipher وظائف كلمة المرور للتشفير وفك التشفير ، وتحصل على مثيلات عن طريق استدعاء Cipher's GetInstance ("des")
يستدعي كائن Cipher طريقة init () لتهيئة الكائن. يتم تحديد المعلمات المحددة لطريقة init () وفقًا للوضع المحدد ، بما في ذلك الثوابت المشفرة والمفصحة.
أخيرًا ، اتصل بـ Cipher's Dofinal () طريقة التشفير وفك التشفير.
هنا أود أن أطرح عليك سؤالاً. سواء كان هذا هو النوع الأول من الترميز باستخدام Base64encoder أو النوع الثاني من org.apache.commons.codec.binary.base64 الترميز ، عند تحويل السلسلة إلى البايت والبايت إلى السلسلة ، مطلوب UTF-8/GBK وتشفيرات أخرى للترميز. هل تم فك تشفيره؟
1. استخدم sun.misc.base64decoder و Base64encoder لفك تشفيرها وترميزها
package com.soufun.com ؛ import java.io.ioException ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.security.securerandom ؛ import java.util.date ؛ import javax.crypto.cipher ؛ import javax.crypto.scretkey ؛ javax.crypto.spec.deskeyspec ؛ // استيراد 64-bit تشفير Sun Import Sun.Misc.base64decoder ؛ import sun.misc.base64encoder ؛/** *@upumn whd * *encoder حتى لو في هذا الوقت ، يمكنك إزالة حزمة JRE واستيرادها مرة أخرى. */الفئة العامة desutil {// تحديد طريقة التشفير الخاصة السلسلة الثابتة النهائية des = "des" ؛ السلسلة الثابتة النهائية الخاصة utf8 = "GBK" ؛ static secretKeyFactory keyfactory = null ؛ ثابت {try {keyfactory = secretKeyFactory.getInstance ("des") ؛ } catch (nosuchalgorithmexception e) {// todo catch catch e.printstacktrace () ؛ }} public static void main (string [] args) يرمي الاستثناء {long begin = new date (). getTime () ؛ String Data = "اختبار التشفير Aaades" ؛ // ملاحظة: أثناء عملية التشفير وفك التشفير ، يجب أن يكون طول المفتاح مضاعفًا لـ 8. string key = "qazwsxed" ؛ System.err.println (Encrypt (البيانات ، المفتاح)) ؛ System.err.println (decrypt (incrypt (data ، key) ، key)) ؛ نهاية طويلة = تاريخ جديد (). getTime () ؛ system.out.println (نهاية begin) ؛ } / ** * الوصف يشفر وفقًا لقيمة المفاتيح * param data * param مفتاح مفتاح مفتاح BYTE ARRAY * RETURN * @Throws استثناء * / سلسلة ثابتة عامة تشفير (بيانات السلسلة ، مفتاح السلسلة) يلقي استثناء {// استخدم الترميز المحدد للحصول على المحتوى المراد تشريعه. بشكل عام ، يكون المفتاح السري هو الحروف أو الأرقام دون تحديد الترميز ، ولكن يمكن أيضًا أن تكون المواصفات بايت [] bt = encrypt (data.getBytes (utf8) ، key.getBytes (utf8)) ؛ // ملاحظة: عند تشفير وفك التشفير ، استخدم Base64Encoder من Sun من Sun لتشفير وفك التشفير ، وإلا فإن هناك رمزًا مشويًا. لدي رمز مشوه هنا ، لذلك يمكنني استخدام BASE64ENCODER () لتشفير وفك تشفير السلسلة strs = new BASE64ENCODER (). ENCODE (BT) ؛ إرجاع Strs. } / ** * الوصف decrypt وفقًا لقيمة المفتاح * param data * param مفتاح تشفير مفتاح byte array * @throws ioException * @throws اثن // ملاحظة: عند تشفير وفك التشفير ، استخدم Base64Encoder من Sun من Sun للترميز وفك التشفير ، وإلا سيكون هناك decoder base64decoder decoder = new Base64Decoder () ؛ byte [] buf = decoder.decodeBuffer (data) ؛ byte [] bt = decrypt (buf ، key.getBytes ()) ؛ إرجاع سلسلة جديدة (BT ، UTF8) ؛ } / ** * الوصف encrypt وفقًا لقيمة المفاتيح * param data * param مفتاح تشفير مفتاح byte array * regurn * @throws استثناء * / خاص بايت ثابت [] incrypt (byte [] data ، byte [] مفتاح) استثناء {// إنشاء رقم عشوائي موثوق به securerandom sr = new securrandom () ؛ // إنشاء كائن deskeyspec من بيانات المفاتيح الأصلية ، أي المحتوى الرئيسي للمفتاح الذي ينشئ مفتاح deskeyspec dks = جديد deskeyspec (مفتاح) ؛ // يتم استخدام المصنع الرئيسي لتحويل المفتاح (مفتاح التشفير Opic من مفتاح النوع) إلى مواصفات المفتاح (تمثيل شفاف للمواد الرئيسية الأساسية) ، والعكس بالعكس. يعمل مصنع المفتاح السري فقط على مفاتيح Secret (متماثلة). // استخدم وضع Singleton بدلاً من ذلك // secretKeyFactory keyfactory = secretKeyFactory.getInstance (des) ؛ // إنشاء كائن SecretKey (مفتاح) وفقًا لمواصفات المفتاح المقدمة (المواد الرئيسية). SecretKey SecureKey = keyfactory.generateSecret (DKS) ؛ // يكمل كائن Cipher بالفعل عملية التشفير ، ويوفر هذه الفئة وظائف كلمة المرور للتشفير وفك التشفير. cipher cipher = cipher.getInstance (des) ؛ // تهيئة هذا التشفير بمفتاح ومصدر عشوائي. يتم استخدام incrypt_mode لتهيئة التشفير إلى وضع ثابت لوضع التشفير. cipher.init (cipher.encrypt_mode ، securekey ، sr) ؛ // التنفيذ الرسمي لعملية التشفير إرجاع cipher.dofinal (البيانات) ؛ } / ** * الوصف decrypt وفقًا لقيمة المفتاح * param data * param مفتاح تشفير مفتاح البايت صفيف byte * regurn * @throws استثناء * / خاص بايت ثابت [] decrypt (byte [] data ، byte [] مفتاح) استثناء {// إنشاء رقم عشوائي موثوق Securrandom sr = new securrandom () ؛ // إنشاء كائن deskeyspec من بيانات المفاتيح الأصلية ، أي المحتوى الرئيسي للمفتاح الذي ينشئ مفتاح deskeyspec dks = جديد deskeyspec (مفتاح) ؛ // يتم استخدام المصنع الرئيسي لتحويل المفتاح (مفتاح التشفير Opic من مفتاح النوع) إلى مواصفات المفتاح (تمثيل شفاف للمواد الرئيسية الأساسية) ، والعكس بالعكس. يعمل مصنع المفتاح السري فقط على مفاتيح Secret (متماثلة). // استخدم وضع Singleton بدلاً من ذلك // secretKeyFactory keyfactory = secretKeyFactory.getInstance (des) ؛ // إنشاء كائن SecretKey (مفتاح) وفقًا لمواصفات المفتاح المقدمة (المواد الرئيسية). SecretKey SecureKey = keyfactory.generateSecret (DKS) ؛ // توفر فئة Cipher وظائف كلمة المرور للتشفير وفك التشفير. cipher cipher = cipher.getInstance (des) ؛ // يتم استخدام Decrypt_Mode لتهيئة التشفير إلى ثابت في وضع فك التشفير. cipher.init (cipher.decrypt_mode ، SecureKey ، sr) ؛ // عملية فك التشفير الرسمية إرجاع cipher.dofinal (البيانات) ؛ }}2. استخدم org.apache.commons.codec.binary.base64 لفك تشفيرها وتشفيرها
package com.soufun.com ؛ import java.io.ioException ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.security.securerandom ؛ import java.util.date ؛ import javax.crypto.cipher ؛ import javax.crypto.scretkey ؛ javax.crypto.spec.deskeyspec ؛ import org.apache.commons.codec.binary.base64 ؛/** *@@المؤلف * */الفئة العامة desutil {// define encryption method private final static string des = "des" ؛ السلسلة الثابتة النهائية الخاصة utf8 = "GBK" ؛ static secretKeyFactory keyfactory = null ؛ ثابت {try {keyfactory = secretKeyFactory.getInstance ("des") ؛ } catch (nosuchalgorithmexception e) {// todo catch catch e.printstacktrace () ؛ }} public static void main (string [] args) يرمي الاستثناء {long begin = new date (). getTime () ؛ String Data = "اختبار التشفير Aaades" ؛ // ملاحظة: أثناء عملية التشفير وفك التشفير ، يجب أن يكون طول المفتاح مضاعفات 8. string key = "qazwsxed" ؛ System.err.println (Encrypt (البيانات ، المفتاح)) ؛ System.err.println (decrypt (incrypt (data ، key) ، key)) ؛ نهاية طويلة = تاريخ جديد (). getTime () ؛ system.out.println (نهاية begin) ؛ } / ** * الوصف encrypt وفقًا لقيمة المفتاح * param data * param مفتاح مفتاح مفتاح Byte byte * regurn * @Throws استثناء * / سلسلة ثابتة عامة تشفير (بيانات السلسلة ، مفتاح السلسلة) يلقي استثناء {// استخدم الترميز المحدد للحصول على المحتوى ليتم تشويه. بشكل عام ، يكون المفتاح هو الحروف أو الأرقام دون تحديد الترميز ، ولكن يمكن أيضًا أن يكون المحدد بايت [] bt = encrypt (data.getBytes (utf8) ، key.getBytes ()) ؛ // يستخدم الأول sun.misc.base64encoder ؛ يتم ترميزه ، ولكن يقال أن باستخدام org.apache.commons.codec.binary.base64 أفضل ، لذلك جرب سلسلة strs = base64.encodeBase64String (BT) ؛ إرجاع Strs. } / ** * الوصف decrypt وفقًا لقيمة المفاتيح * param data * param مفتاح تشفير مفتاح byte array * reghrows ioException * @throws استثناء * / السلسلة الثابتة العامة decrypt (بيانات السلسلة ، مفتاح السلسلة) رمي ioException ، استثناء {if (data == null) return null ؛ // استخدام org.apache.commons.codec.binary.base64 لفك تشفير البايت [] buf = base64.decodeBase64 (البيانات) ؛ byte [] bt = decrypt (buf ، key.getBytes ()) ؛ إرجاع سلسلة جديدة (BT ، UTF8) ؛ } / ** * الوصف encrypt وفقًا لقيمة المفتاح * param data * param مفتاح مفتاح مفتاح مفتاح byte byte * regurn * @throws استثناء * / خاص بايت ثابت [] incrypt (byte [] data ، byte [] مفتاح) استثناء {// إنشاء رقم عشوائي موثوق به Securerandom sr = new securrandom () ؛ // إنشاء كائن deskeyspec من بيانات المفاتيح الأصلية ، أي المحتوى الرئيسي للمفتاح الذي ينشئ مفتاح deskeyspec dks = جديد deskeyspec (مفتاح) ؛ // يتم استخدام المصنع الرئيسي لتحويل المفتاح (مفتاح التشفير Opic من مفتاح النوع) إلى مواصفات المفتاح (تمثيل شفاف للمواد الرئيسية الأساسية) ، والعكس بالعكس. يعمل مصنع المفتاح السري فقط على مفاتيح Secret (متماثلة). // استخدم وضع Singleton بدلاً من ذلك // secretKeyFactory keyfactory = secretKeyFactory.getInstance (des) ؛ // إنشاء كائن SecretKey (مفتاح) وفقًا لمواصفات المفتاح المقدمة (المواد الرئيسية). SecretKey SecureKey = keyfactory.generateSecret (DKS) ؛ // يكمل كائن Cipher بالفعل عملية التشفير ، ويوفر هذه الفئة وظائف كلمة المرور للتشفير وفك التشفير. cipher cipher = cipher.getInstance (des) ؛ // تهيئة هذا التشفير بمفتاح ومصدر عشوائي. يتم استخدام incrypt_mode لتهيئة التشفير إلى وضع ثابت لوضع التشفير. cipher.init (cipher.encrypt_mode ، securekey ، sr) ؛ // التنفيذ الرسمي لعملية التشفير إرجاع cipher.dofinal (البيانات) ؛ } / ** * الوصف decrypt وفقًا لقيمة المفتاح * param data * param مفتاح تشفير مفتاح البايت صفيف byte * regurn * @throws استثناء * / خاص بايت ثابت [] decrypt (byte [] data ، byte [] مفتاح) استثناء {// إنشاء رقم عشوائي موثوق Securrandom sr = new securrandom () ؛ // إنشاء كائن deskeyspec من بيانات المفاتيح الأصلية ، أي المحتوى الرئيسي للمفتاح الذي ينشئ مفتاح deskeyspec dks = جديد deskeyspec (مفتاح) ؛ // يتم استخدام المصنع الرئيسي لتحويل المفتاح (مفتاح التشفير Opic من مفتاح النوع) إلى مواصفات المفتاح (تمثيل شفاف للمواد الرئيسية الأساسية) ، والعكس بالعكس. يعمل مصنع المفتاح السري فقط على مفاتيح Secret (متماثلة). // استخدم وضع Singleton بدلاً من ذلك // secretKeyFactory keyfactory = secretKeyFactory.getInstance (des) ؛ // إنشاء كائن SecretKey (مفتاح) وفقًا لمواصفات المفتاح المقدمة (المواد الرئيسية). SecretKey SecureKey = keyfactory.generateSecret (DKS) ؛ // توفر فئة Cipher وظائف كلمة المرور للتشفير وفك التشفير. cipher cipher = cipher.getInstance (des) ؛ // يتم استخدام Decrypt_Mode لتهيئة التشفير إلى ثابت في وضع فك التشفير. cipher.init (cipher.decrypt_mode ، SecureKey ، sr) ؛ // عملية فك التشفير الرسمية إرجاع cipher.dofinal (البيانات) ؛ }}تنزيل عنوان الحزمة المستخدمة في 1 و 2:
تنزيل: sun.misc.base64decoder.
تنزيل: Apache's Base64 الترميز ، فك التشفير.
3. لا يتم استخدام الترميز ، حزمة فك التشفير
package com.soufun.com ؛ import java.io.ioException ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.util.date ؛ استيراد java.util.hashmap ؛ استيراد java.util.map javax.crypto.secretkekefactory ؛ استيراد javax.crypto.spec.deskeyspec ؛ استيراد javax.crypto.spec.ivparameterspec ؛/** *@equate whd * */public class descrypt {static secretKeyFactoyFactory = null ؛ // Cipher's "خوارزمية/نمط/ملء" Static Final String Cipher = "des/CBC/PKCS5Padding" ؛ ثابت {try {// احصل على مفتاح سري secretKeyFactory = secretKeyFactory.getInstance ("des") ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ }} // تعريف الثوابت ، تشفير تنسيق خاص ثابت Static Final String UTF8 = "GBK" ؛ /** Container for Object Cache*/ Static Abstract Class Cache {Private Final Map InnerCache = New HashMap () ؛ الكائن التجريدي المحمي CreateValue (مفتاح الكائن) يلقي الاستثناء ؛ الكائن العام الحصول على (مفتاح الكائن) يلقي استثناء {كائن قيمة ؛ synchronized (innercache) {value = innercache.get (key) ؛ if (value == null) {value = new CreatePlaceHolder () ؛ innercache.put (المفتاح ، القيمة) ؛ }} if (مثيل القيمة لـ createPlaceHolder) {synchronized (value) {createPlaceholder progress = (createPlaceHolder) ؛ if (progress.value == null) {progress.value = createvalue (key) ؛ Synchronized (innercache) {innercache.put (المفتاح ، progress.value) ؛ }} return progress.value ؛ }} قيمة الإرجاع ؛ } static final classeplaceholder {comfort value ؛ }} / * * hex-> str & str-> hex * / public static byte [] stringtoex (String ss) {// string conversion we byte byte [] = new byte [ss.Length () / 2] ؛ لـ (int i = 0 ؛ i <digest.length ؛ i ++) {string bytestring = ss.subString (2 * i ، 2 * i+2) ؛ int bytevalue = integer.parseint (bytestring ، 16) ؛ Digest [i] = (byte) bytevalue ؛ } إرجاع Digest ؛ } السلسلة الثابتة العامة HextoString (Byte B []) {StringBuffer HexString = new StringBuffer () ؛ لـ (int i = 0 ؛ i <b.length ؛ i ++) {string plaintext = integer.toHexString (0xff & b [i]) ؛ if (plaintext.length () <2) {hexstring.append ("0") ؛ } hexstring.append (plaintext) ؛ } إرجاع hexstring.toString () ؛ } بايت ثابت خاص [] _convertkeyiv (نص سلسلة) يلقي ioException {if (text.length () == 8) {return text.getBytes (Utf8) ؛ } if (text.startswith ("0x") && text.length () == 32) {byte [] result = new byte [8] ؛ لـ (int i = 0 ؛ i <text.length () ؛ i+= 2) {if (text.charat (i ++) == '0' && text.charat (i ++) == 'x') {try {result [i / 4] = (byte) integer.parseint (text.substring (i ، i+2) ، 16) ؛ } catch (استثناء e) {رمي ioException جديد ("txt '" + text + "' غير صالح!") ؛ }}} نتيجة الإرجاع ؛ } رمي ioException جديد ("txt '" + text + "' غير صالح!") ؛ } /** SecretKey & Ivparameterspec's cache* / private static cache secretKeySpecs = new cache () {كائن محمي CreateValue (مفتاح الكائن) يلقي استثناء {secretkey secretKeyObj = null ؛ حاول {secretKeyObj = secretKeyFactory.GenerateSecret (New DeskeySpec (_convertkeyiv ((سلسلة) مفتاح))) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } return secretKeyObj ؛ }} ؛ ذاكرة التخزين المؤقت الثابتة الخاصة ivparamspecs = new cache () {createvalue الكائن المحمي (مفتاح الكائن) يلقي الاستثناء {ivparameterspec ivobj = null ؛ IVOBJ = مفتاح IVParameterSpec (_convertekeyiv ((سلسلة)) جديد)) ؛ إرجاع Ivobj ؛ }} ؛ /** التشفير وفك التشفير*/ سلسلة ثابتة عامة تشفير (نص سلسلة ، سلسلة uply ، string uply) {secretKey secretKeyObj = null ؛ ivparameterspec ivobj = null ؛ حاول {secretKeyObj = (secretKey) secretKeySpecs.get (authkey) ؛ IVOBJ = (IVParameterspec) ivparamspecs.get (authiv) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } byte [] data = null ؛ حاول {data = text.getBytes (utf8) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } byte [] authtoken = null ؛ حاول {authtoken = encrypt (data ، secretKeyObj ، ivobj) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع hextoString (authtoken) ؛ } البايت الثابت العام [] encrypt (byte [] data ، secretkey secretkey ، ivparameterspec IV) يرمي الاستثناء {cipher cipher = cipher.getinstance (cipher) ؛ cipher.init (cipher.encrypt_mode ، secretkey ، IV) ؛ إرجاع cipher.dofinal (البيانات) ؛ } سلسلة ثابتة عامة decrypt (String hexstring ، string authkey ، string authiv) يلقي الاستثناء {secretKey secretKeyObj = null ؛ ivparameterspec ivobj = null ؛ حاول {secretKeyObj = (secretKey) secretKeySpecs.get (authkey) ؛ IVOBJ = (IVParameterspec) ivparamspecs.get (authiv) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } text string = decrypt (hexstring ، secretKeyObj ، ivobj) ؛ إعادة النص ؛ } سلسلة ثابتة عامة Decrypt (رسالة سلسلة ، SecretKey SecretKey ، ivparameterspec IV) يلقي الاستثناء {byte [] data = stringtoex (message) ؛ إرجاع decrypt (البيانات ، secretkey ، IV) ؛ } سلسلة ثابتة عامة فك التشفير (Byte [] Data ، SecretKey SecretKey ، Ivparameterspec IV) يرمي استثناء {cipher cipher = cipher.getinstance (cipher) ؛ cipher.init (cipher.decrypt_mode ، secretkey ، IV) ؛ بايت [] retbyte = cipher.dofinal (البيانات) ؛ إرجاع سلسلة جديدة (retbyte) ؛ } public static void main (string [] args) يلقي الاستثناء {long begin = new date (). getTime () ؛ String AuthKey = "W8F3K9C2" ؛ String Authiv = "W8F3K9C2" ؛ Text Text = "اختبار التشفير Aaades" ؛ // 140CB412BA03869F // 140CB412BA03869F // تشفير سلسلة النص الأصلية ENCRYPTEDTEXT = ENCRYPT (TEXT ، AUTHKEY ، AUTHKEY) ؛ System.out.println ("EncryptedText:" + EncryptedText) ؛ // استعادة سلسلة ciphertext plaintext = decrypt (EncryptedText ، authkey ، authiv) ؛ System.out.println ("plaintext:" + plaintext) ؛ // 2A329740CE15F549BE64190B183A5BE2 END Long = New Date (). GetTime () ؛ system.out.println (نهاية begin) ؛ }}ملاحظة: يمكن للأصدقاء المهتمين بالتشفير وفك التشفير أيضًا أن يشير إلى الأدوات عبر الإنترنت لهذا الموقع:
الكشف عن أمان كلمة المرور عبر الإنترنت:
http://tools.vevb.com/password/my_password_safe
مولد كلمة المرور عالي القوة:
http://tools.vevb.com/password/createstrongpassword
أدوات تشفير URL الرعد ، Express ، و Tornado:
http://tools.vevb.com/password/urlrethunder
أداة تشفير خوارزمية التجزئة عبر الإنترنت:
http://tools.vevb.com/password/hash_encrypt
عبر الإنترنت MD5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160 أداة التشفير:
http://tools.vevb.com/password/hash_md5_sha
sha1/sha224/sha256/sha384/sha512 أداة التشفير:
http://tools.vevb.com/password/sha_encode
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.