DES خوارزمية التشفير
DES هو معيار تشفير بيانات الاسم الكامل ، وهو خوارزمية كتلة تستخدم تشفير المفاتيح. تم تحديده على أنه معيار معالجة البيانات الفيدرالية (FIPS) من قبل مكتب المعايير الوطنية للحكومة الفيدرالية الأمريكية في عام 1976 ، وتم توزيعها على نطاق واسع على نطاق واسع على المستوى الدولي.
هناك ثلاثة معلمات دخول لخوارزمية DES: المفتاح والبيانات والوضع. من بينها ، المفتاح هو 7 بايت ، 56 بت في المجموع ، وهو المفتاح العاملة لخوارزمية DES ؛ البيانات هي 8 بايت ، 64 بت في المجموع ، وهي البيانات التي سيتم تشفيرها أو فك تشفيرها ؛ الوضع هو وضع عمل DES: التشفير أو فك التشفير.
تقوم خوارزمية DES بتحويل كتلة إدخال النص العادي 64 بت إلى كتلة إخراج مشفر 64 بت. المفتاح الذي يستخدمه هو أيضًا 56 بت. تنقسم خوارزميةها بشكل أساسي إلى خطوتين:
1) تتمثل وظيفة التقليب الأولية في إعادة تجميع كتل البيانات 64 بت في البتات وتقسيم الإخراج إلى جزأين: L0 و R0 ، يبلغ طول كل جزء 32 بت. تتمثل قاعدة التقليب في تبديل الجزء 58 من المدخلات إلى الجزء الأول ، والبتة الخمسين إلى الجزء الثاني ... وهكذا ، فإن الجزء الأخير هو الجزء السابع الأصلي. L0 و R0 هما الجزءان بعد إخراج النقل ، L0 هو 32 بتات من الإخراج اليسرى ، و R0 هو 32 بت الأيمن. مثال: اضبط قيمة الإدخال قبل النقل إلى D1D2D3 ... D64 ، ثم النتيجة بعد التقليب الأولي هي: L0 = D58D50 ... D8 ؛ R0 = D57D49 ... D7.
يتم عرض قواعد الاستبدال في الجدول التالي:
58،50،42،34،26،18،10،2،60،52،44،36،28،20،2،4،62،54،46،38،30،22،14،64،56،48،40،32،24،16،8 ، 57،49،41،33،25،17،9،1،59،51،43،35،27،19،11،3،61،53،45،37،29،21،13،5،63،55،47،39،31،23،15،7 ،
2) بعد 16 عملية التكرار ، يتم الحصول على L16 و R16. خذ هذا كمدخل وأداء التقليب العكسي. إن التقلب العكسي هو بالضبط العملية العكسية للتقليب الأولي ، وبالتالي الحصول على إخراج النص المشفر.
هذه الخوارزمية هي ممثل لنظام خوارزمية التشفير المتماثل ويستخدم على نطاق واسع في أنظمة شبكة الكمبيوتر.
تنفيذ Java الأساسي
حزمة com.stone.security ؛ استيراد java.security.key ؛ استيراد java.security.securerandom ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.keygenerator ؛ استيراد javax.crypto.secretkeke ؛ استيراد javax.crypto.secretkeyfactory ؛ استيراد javax.crypto.spec.deskeyspec ؛ استيراد javax.crypto.spec.ivparameterspec ؛ / *** DES خوارزمية 1972 التي طورتها IBM في الولايات المتحدة ، خوارزمية التشفير المتماثل*/ الفئة العامة des {// خوارزمية اسم السلسلة النهائية الثابتة key_algorithm = "des" ؛ // خوارزمية الاسم/وضع التشفير/طريقة التعبئة العامة الثابتة العامة في السلسلة النهائية cipher_algorithm_ecb = "des/ecb/pkcs5padding" ؛ Static Static Final Final Cipher_algorithm_cbc = "des/cbc/pkcs5padding" ؛ لا يمكن استخدام MAIN Public Static Void (سلسلة [] args) استثناء { / * * * استخدام وضع المفتاح ECB * لإنشاء مفتاح * ECB Mode IV * / byte [] key = generateKey () ؛ byte [] encrypt = encrypt ("Gasculitis f#*(x)". getBytes () ، key) ؛ System.out.println (سلسلة جديدة (decrypt (Encrypt ، Key))) ؛ / * * استخدم وضع CBC * استخدم المصنع الرئيسي لإنشاء المفتاح ، وتشفير وفك التشفير * IV: DES في وضع CBC وأصفاد RSA مع عملية تشفير OAEP. */ deskeyspec dks = new deskeyspec (generateKey ()) ؛ SecretKeyFactory Factory = secretKeyFactory.getInstance (key_algorithm) ؛ SecretKey SecretKey = Factory.GenerateSecret (DKS) ؛ cipher cipher = cipher.getInstance (cipher_algorithm_cbc) ؛ cipher.init (cipher.encrypt_mode ، secretkey ، new ivparameterspec (getiv ())) ؛ byte [] enc = cipher.dofinal ("gasculitis a ٪ f#*(x)". getBytes ()) ؛ // encrypt cipher.init (cipher.decrypt_mode ، secretkey ، new ivparameterspec (getiv ())) ؛ بايت [] ديسمبر = cipher.dofinal (enc) ؛ // decrypt system.out.println (سلسلة جديدة (ديسمبر)) ؛ } static byte [] getiv () {string iv = "asdfivh7" ؛ // IV طول: يجب أن يكون 8 بايت عائد طويل IV.GetBytes () ؛ } / ** * إنشاء مفتاح * * RETURN * @Throws استثناء * / بايت ثابت خاص [] cenderateKey () يلقي الاستثناء {keygenerator keygenerator = keygenerator.getInstance (key_algorithm) ؛ keygenerator.init (56) ؛ // يجب أن تكون DES 56 ، لا يتعين على هذه الطريقة الأولية استدعاء SecretKey SecretKey = keygenerator.generateKey () ؛ return secretKey.getenCoded () ؛ } / ** * استعادة مفتاح * * param مفتاح * regurn * throws استثناء * / مفتاح ثابت خاص tokey (byte [] مفتاح) يلقي الاستثناء {deskeyspec des = new deskeyspec (مفتاح) ؛ secretKeyFactory keyfactory = secretKeyFactory.getInstance (key_algorithm) ؛ SecretKey SecretKey = keyfactory.generateSecret (des) ؛ إرجاع Secretkey } / *** encrypt* param data text Original Text* param key* @return ciphertext* athrows استثناء* / بايت ثابت عام [] incrypt (byte [] data ، byte [] key) يلقي الاستثناء {key k = toKey (مفتاح) ؛ cipher cipher = cipher.getInstance (cipher_algorithm_ecb) ؛ cipher.init (cipher.encrypt_mode ، k ، new Securerandom ()) ؛ إرجاع cipher.dofinal (البيانات) ؛ } / *** decrypt* param password data* @param key* return text ، النص الأصلي* athrows استثناء* / بايت ثابت عام [] decrypt (byte [] data ، byte [] key) يلقي استثناء {key k = toKey (مفتاح) ؛ cipher cipher = cipher.getInstance (cipher_algorithm_ecb) ؛ cipher.init (cipher.decrypt_mode ، k ، new Securerandom ()) ؛ إرجاع cipher.dofinal (البيانات) ؛ }} تطبيق Java Triple DES:
حزمة com.stone.security ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.keygenerator ؛ استيراد javax.crypto.secretkeke ؛ استيراد javax.crypto.secretkeyfactory ؛ استيراد javax.crypto.spec.desedekeyspec ؛ استيراد javax.crypto.spec.ivparameterspec ؛ / ** * يتم استخدام Triple Encryption 3Des أيضًا كـ Triple des ، */ Public Class Tripedes {// name name public static string key_algorithm = "desede" ؛ // خوارزمية الاسم/وضع التشفير/طريقة التعبئة العامة الثابتة في السلسلة النهائية Cipher_algorithm_ecb = "Desede/ECB/PKCS5Padding" ؛ Static Static Final Final Cipher_algorithm_cbc = "Desede/CBC/PKCS5Padding" ؛ keygenerator الخاص الخاص ؛ Secretkey الخاص ؛ secretkey privatekey2 ؛ الشفرات المشفرة الخاصة. بايت ثابت خاص [] incryptdata ؛ يرمي الفراغ الثابت العام (سلسلة [] args) الاستثناء {Tripledes Tripledes = Tripledes جديد ("ECB") ؛ tripledes.encrypt ("sau8jzxlcvm ، '123`98 (*^& ٪ ^^ jcb zx >> a <s <}} {") ؛ system.out.println ("بعد التشفير:" + سلسلة جديدة (Tripledes.Decryptaptdata))))))))) tripledes.encrypt2 ("sau8jzxlc dqv#> <« | vm ، '123`98 (*^& ٪ ^^ jcb zx >> a <s <}} {") ؛ system.out.println (" بعد التشفير: string (tripledes.decrypt2 (incryptdata)) ؛ keygenerator.getInstance (key_algorithm) ؛ DeseDekeySpec (keygen.generatekey (). getencoded ()) ؛ cipher.init (cipher.encrypt_mode ، secretKey) ؛ إرجاع incryptdata = cipher.dofinal (str.getBytes ()) ؛ } / ** * decrypt * param encrypt * regurn * @throws استثناء * / public byte [] decrypt (byte [] encrypt) يرمي الاستثناء {cipher.init (cipher.decrypt_mode ، secretkey) ؛ إرجاع incryptdata = cipher.dofinal (encrypt) ؛ } byte [] getiv () {return "administ" .getBytes () ؛ } / ** * encrypt * param str * regurn * @throws استثناء * / public byte [] encrypt2 (String str) يرمي استثناء {cipher.init (cipher.encrypt_mode ، secretKey2 ، new ivparameterspec (getiv ())) ؛ إرجاع incryptdata = cipher.dofinal (str.getBytes ()) ؛ } / ** * decrypt * param encrypt * return * athrows استثناء * / public byte [] decrypt2 (byte [] encrypt) rems {cipher.init (cipher.decrypt_mode ، secretkey2 ، new ivparameterspec (getiv ())) ؛ إرجاع incryptdata = cipher.dofinal (encrypt) ؛ }}