قبل بضعة أيام ، ظهرت الشائعات فجأة على الإنترنت: تسرب بيانات قدره 12 جرام في الشرق معين ، وفي النهاية ، لم أنكر ذلك في بيان ، وبالكاد تم قبوله. هناك بالفعل الكثير من الأشخاص الذين قالوا ما هو تأثير هذا الأمر على الأشخاص العاديين وكيفية القيام بذلك ، لذلك لن انضم إلى المرح. دعنا نتحدث عن خوارزمية التشفير العملية التي أعتقد شخصيا أنها آمنة نسبيا في الوقت الحاضر: أسماك النفخ.
قبل إدخال الكود ، اسمحوا لي أن أتحدث عن خصائص خوارزمية تشفير الأسماك:
1. التشفير المتماثل ، أي المفتاح المشفر والمفتاح الذي تم فك تشفيره متماثلان ؛
2. النتائج بعد كل تشفير مختلفة (هذا شيء أقدره أكثر) ؛
3. قابلة للعكس ، تختلف عن الخوارزميات المجردة مثل MD5 المقدمة في مقالتي السابقة ، فهي قابلة للعكس ؛
4. السرعة السريعة ، تتكون عملية التشفير وفك التشفير بشكل أساسي من عمليات تعليمات ADD و XOR ؛
5. مجانًا ، يمكن لأي شخص استخدامه مجانًا دون دفع رسوم حقوق الطبع والنشر ؛
6. يمكن لركوب الأسماك تشفير وفك تشفير 8 بايت من البيانات في وقت واحد ؛
خوارزمية السمكة هي خوارزمية تشفير حزمة متماثلة. يكمن جوهر الخوارزمية في توليد المفاتيح الفرعية ، والذي يوسع مفتاح الطول المتغير إلى صفيف مفتاح فرعي بطول إجمالي يبلغ 4168Byte. يتم استخدام عدد كبير من المفاتيح الفرعية في الخوارزمية ، وتعتمد المفاتيح الفرعية على مفتاح المستخدم. في عملية الإضافة/فك التشفير الفعلية ، يتم استخدام صفيف المفتاح الفرعي المحدث ، وهي صفيف P و S Box. تحتوي خوارزمية الأسماك على وظيفة تشفير أساسية: BF_EN (). إدخال هذه الوظيفة هي معلومات النص العادي 64 بت. بعد الحساب ، يتم إخراجها في شكل معلومات النص المشفر 64 بت. لتشفير المعلومات باستخدام خوارزمية Blowfish ، هناك حاجة إلى عمليتين: المعالجة المسبقة للمفاتيح وتشفير المعلومات. وبالمثل ، يتطلب فك التشفير أيضًا عمليتين ، والمعالجة المسبقة الرئيسية وفك تشفير المعلومات.
يتم إصلاح مفتاح المصدر لخوارزمية سمكة النفخ - Pbox و Sbox. إذا كنا نريد تشفير رسالة ، نحتاج إلى اختيار مفتاح واستخدام هذا المفتاح لتحويل Pbox و Sbox للحصول على key_pbox و key_sbox لاستخدامه في الخطوة التالية من تشفير المعلومات. وينطبق الشيء نفسه على فك التشفير. نظرًا لأن Blowfish عبارة عن خوارزمية تشفير متماثلة ، فإن طرف فك التشفير ينشئ key_box و key_sbox المطلوب لفك التشفير بناءً على المفتاح بعد الحصول على المفتاح. تشفير وفك تشفير نفس المعلومات ، وستؤدي المفاتيح المختلفة المحددة إلى تشفير مختلف. لذلك ، يكمن مفتاح خوارزمية السمك في اختيار المفتاح والسرية.
نظرًا لأن خوارزمية Blowfish تستخدم مفاتيح متغيرة الطول ، فإن هذا لا يجلب راحة كبيرة للمستخدمين فحسب ، بل يحتوي أيضًا على مخاطر مخفية. نظرًا لأن جوهر تشفير الخوارزمية/فك التشفير يكمن في اختيار وسرية المفاتيح ، في التطبيقات الفعلية ، غالبًا ما يتم استخدام بعض المفاتيح الضعيفة لتشفير موارد المعلومات ، مما يؤدي إلى مخاطر أمنية كبيرة.
التالي هو الجزء الأكثر أهمية ، تنفيذ خوارزمية تشفير الأسماك:
حزمة cn.bridgeli.encrypt ؛ التعداد العام blowfishmanager {bridgeli_cn ("bridgeli_cn!@#$ abc123_") ؛ blowfishmanager الخاص (String secret) {this.blowfish = new blowfish (secret) ؛ } أسماك النفخ الخاصة. blowfish public getBlowfish () {return blowfish ؛ } / ** * decrypt * param sciphertext * @return * / سلسلة عامة decryptstring (سلسلة sciphertext) {return this.getblowfish (). decryptstring (sciphertext) ؛ } / ** * encrypt * param splaintext * return * / السلسلة العامة encryptString (سلسلة splaintext) {return this.getBlowfish (). EncryptString (splaintext) ؛ } main static void main (string [] args) {string encryptString = blowfishmanager.bridgeli_cn.encryptString (10 + "") ؛ System.out.println (EncryptString) ؛ سلسلة decryptstring = blowfishmanager.bridgeli_cn.decryptString (EncryptString) ؛ system.out.println (decryptstring) ؛ }}هذه واجهة خارجية ، وهي بسيطة للغاية للاستخدام وسهلة الاستخدام. فيما يلي التنفيذ المحدد للخوارزمية:
package cn.bridgeli.encrypt ؛ import java.security.messagedigest ؛ import java.util.random ؛ import org.slf4j.logger ؛ import org.slf4j.loggerfactory ؛ public class blowfish {private static logger loggerfactory.getlogger (blooffish.class) ؛ يمتد blowfishcbc من الفئة الثابتة الخاصة إلى {public void setcbciv (longcbciv long) {m_lcbciv = lnewcbciv ؛ } public void setcbciv (byte newcbciv []) {m_lcbciv = blowfish.bytearraytolong (newcbciv ، 0) ؛ } Override public void cleanup () {m_lcbciv = 0l ؛ super.cleanup () ؛ } private encryptblockcbc (Long lplainblock) {lplainblock ^= m_lcbciv ؛ lplainblock = super.encryptblock (lplainblock) ؛ إرجاع m_lcbciv = lplainblock ؛ } private decryptblockcbc (lcipherblock long) {long ltemp = lcipherblock ؛ lcipherblock = super.decryptblock (lcipherblock) ؛ lcipherblock ^= m_lcbciv ؛ m_lcbciv = ltemp ؛ إرجاع lcipherblock ؛ } public void Encrypt (byte buffer []) {int nlen = buffer.length ؛ لـ (int ni = 0 ؛ ni <nlen ؛ ni += 8) {long ltemp = blowfish.bytearraytolong (buffer ، ni) ؛ ltemp = encryptblockcbc (ltemp) ؛ blowfish.longtobytearray (ltemp ، buffer ، ni) ؛ }} public void decrypt (byte buffer []) {int nlen = buffer.length ؛ لـ (int ni = 0 ؛ ni <nlen ؛ ni += 8) {long ltemp = blowfish.bytearraytolong (buffer ، ni) ؛ ltemp = decryptblockcbc (ltemp) ؛ blowfish.longtobytearray (ltemp ، buffer ، ni) ؛ }} long m_lcbciv ؛ blowfishcbc العامة (byte bfkey []) {super (bfkey) ؛ setcbciv (0L) ؛ } blowfishcbc العامة (byte bfkey [] ، long linitcbciv) {super (bfkey) ؛ setcbciv (linitcbciv) ؛ } blowfishcbc العامة (byte bfkey [] ، byte initcbciv []) {super (bfkey) ؛ setcbciv (initcbciv) ؛ }} private static class blowfishecb {public void cleanup () {for (int ni = 0 ؛ ni <18 ؛ ni ++) {m_pbox [ni] = 0 ؛ } لـ (int ni = 0 ؛ ni <256 ؛ ni ++) {m_sbox1 [ni] = m_sbox2 [ni] = m_sbox3 [ni] = m_sbox4 [ni] = 0 ؛ }} EncryptBlock Long المحمي (llplainblock long) {int nhi = blowfish.longhi32 (lplainblock) ؛ int nlo = blowfish.longlo32 (lplainblock) ؛ int sbox1 [] = m_sbox1 ؛ int sbox2 [] = m_sbox2 ؛ int sbox3 [] = m_sbox3 ؛ int sbox4 [] = m_sbox4 ؛ int pbox [] = m_pbox ؛ nhi ^= pbox [0] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [1] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [2] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [3] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [4] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [5] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [6] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [7] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [8] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [9] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [10] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [11] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [12] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [13] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [14] ؛ nlo ^ = (sbox1 [nhi >>> 24] + sbox2 [nhi >>> 16 & 0xff] ^ sbox3 [nhi >>> 8 & 0xff]) + sbox4 [nhi & 0xff] ^ pbox [15] ؛ nhi ^ = (sbox1 [nlo >>> 24] + sbox2 [nlo >>> 16 & 0xff] ^ sbox3 [nlo >>> 8 & 0xff]) + sbox4 [nlo & 0xff] ^ pbox [16] ؛ return blowfish.makelong (NHI ، nlo ^ pbox [17]) ؛ } decryptblock طويلة المحمية (lcipherblock طويلة) {int nhi = blowfish.longhi32 (lcipherblock) ؛ int nlo = blowfish.longlo32 (lcipherblock) ؛ nhi ^= m_pbox [17] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [16] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [15] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [14] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [13] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [12] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [11] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [11] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [10] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [9] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [8] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [7] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [7] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [6] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [5] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [4] ؛ nhi ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [4] ؛ nhi ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [3] ؛ nlo ^ = (m_sbox1 [nhi >>> 24] + m_sbox2 [nhi >>> 16 & 0xff] ^ m_sbox3 [nhi >>> 8 & 0xff]) + m_sbox4 [nhi & 0xff] ^ m_pbox [2] ؛ nlo ^ = (m_sbox1 [nlo >>> 24] + m_sbox2 [nlo >>> 16 & 0xff] ^ m_sbox3 [nlo >>> 8 & 0xff]) + m_sbox4 [nlo & 0xff] ^ m_pbox [1] ؛ return blowfish.makelong (NHI ، nlo ^ m_pbox [0]) ؛ } int m_pbox [] ؛ int m_sbox1 [] ؛ int m_sbox2 [] ؛ int m_sbox3 [] ؛ int m_sbox4 [] ؛ ثابت نهائي int pbox_init [] = {0x243f6a88 ، 0x85a308d3 ، 0x13198a2e ، 0x3707344 ، 0xa4093822 ، 0x299f31d0 ، 0x82efa98 ، 0xec4e6c89 ، 0x4521e6 ، 0x38d01377 ، 0xbe5466cf ، 0x34e90c6c ، 0xc0ac29b7 ، 0xc97c50dd ، 0x3f84d5b5 ، 0xB5470917 ، 0x9216d9 ، 0x89979fb1b} ؛ ثابت نهائي int sbox_init_1 [] = {0xd1310ba6 ، 0x98dfb5ac ، 0x2ffd72db ، 0xd01adfb7 ، 0xb8e1afed ، 0x6a267e96 ، 0xba7c9045 ، 0xf12c7f99 0xb3916cf7 ، 0x801f2e2 ، 0x858efc16 ، 0x636920d8 ، 0x71574e69 ، 0xa458fea3 ، 0xf4933d7e ، 0xd95748f ، 0x728eb658 ، 0x7b54a41d ، 0xc25a59b5 ، 0x9c30d539 ، 0x2af26013 ، 0xc5d1b023 ، 0x286085f0 ، 0xca417918 ، 0xb8db38ef ، 0x8e79dcb0 0xb01e8a3e ، 0xd71577c1 ، 0xbd314b27 ، 0x78af2fda ، 0x55605c60 ، 0xe65525f3 ، 0xaa55ab94 ، 0x5748962 ، 0x63e81440 ، 0x55ca394 ، 0xb4cc5c34 ، 0x1141e8ce ، 0xa15486af ، 0x7c72e993 ، 0xb3ee1411 ، 0x636fbc2a ، 0x2ba9c55d ، 0x741831f6 ، 0xce5c3e16 0x6c24cf5c ، 0x7a325381 ، 0x28958677 ، 0x3b8f4898 ، 0x6b4bb9af ، 0xc4bfe81b ، 0x66282193 ، 0x61d809cc ، 0xfb21a991 0xef845d5d ، 0xe98575b1 ، 0xdc262302 ، 0xeb651b88 ، 0x23893e81 ، 0xd396acc5 ، 0xf6d6ff3 ، 0x83f44239 ، 0x2e0b4482 ، 0xa4842004 ، 0x9e1f9b5e ، 0x21c66842 ، 0xf6e96c9a ، 0x670c9c61 ، 0xabd388f0 ، 0x6a51a0d2 ، 0xd8542f68 ، 0x960fa728 ، 0xab513333333. 0xba3bf050 ، 0x7efb2a98 ، 0xa1f1651d ، 0x39af0176 ، 0x66ca593e ، 0x82430e88 ، 0x8b8619 ، 0x456f9fb4 ، 0x7d84a5c3 ، 0x85c12073 ، 0x401a449f ، 0x56c16aa6 ، 0x4ed3aa62 ، 0x363f7706 ، 0x1bfedf72 ، 0x429b023d ، 0x37d0d724 ، 0xd00a1248 0x75372c9 ، 0x80991b7b ، 0x25d479d8 ، 0xf6e8def7 ، 0xe3fe501a ، 0xb6794c3b ، 0x976ce0bd ، 0x4c006ba ، 0xc1a94fb6 ، 0x409f60c4 ، 0x196a2463 ، 0x68fb6faf ، 0x3e6c53b5 ، 0x1339b2eb ، 0x3b52ec6f ، 0x6dfc511f ، 0x9b30952c ، 0xcc814544 ، 0xaf5ebd09 0x660f2807 ، 0x192e4bb3 ، 0xc0cba857 ، 0x45c8740f ، 0xd20b5f39 ، 0xb9d3fbdb ، 0x5579c0bd ، 0x1a60a ، 0xd6a100c6 0xfb1fa3cc ، 0x8ea5e9f8 ، 0xdb3222f8 ، 0x3c7516df ، 0xfd616b15 ، 0x2f501ec8 ، 0xad0552ab ، 0x323db5fa ، 0xfd238760 ، 0x5317b48 ، 0x9e5c57bb ، 0xca6f8ca0 ، 0x1a87562e ، 0xdf1769db ، 0xd542a8f6 ، 0x287effc3 ، 0xac6732c6 ، 0x8c4f573 ، 0x695b27b0 0xb8f011a0 ، 0x10fa3d98 ، 0xfd2183b8 ، 0x4afcb56c ، 0x2dd1d35b ، 0x9a53e479 ، 0xb6f84565 ، 0xd28e49bc ، 0x4bfb9790 0x62fb1341 ، 0xcee4c6e8 ، 0xef20cada ، 0x36774c01 ، 0xd07e9efe ، 0x2bf11fb4 ، 0x95dbda4d ، 0xae909198 ، 0xeaad8e71 ، 0x6b93d5a0 ، 0xd1d0 ، 0xafc725e0 ، 0x8e3c5b2f ، 0x8e7594b7 ، 0x8ff6e2fb ، 0xf212b64 ، 0x8888b812 ، 0x900df01c ، 0x4fad5ea0 ، 0x688fc31c ، 0x2f2218 ، 0xbe0e1777 ، 0xea752dfe ، 0x8b021fa1 ، 0xe5a0cc0f ، 0xb56f74e8 ، 0x18acf3d6 ، 0xce89e299 ، 0xb4a84fe0 ، 0xfd13e0b7 ، 0xD2ADA8D9 ، 0x165FA266 ، 0x80957705 ، 0x93CC7314 ، 0x211A1477 ، 0xE6AD2065 ، 0x77B5FA86 ، 0xc75442f5 ، 0xfb9d35cf ، 0xd6411bd3 ، 0xae1e7e49 ، 0x250e2d ، 0x2071b35e ، 0x226800bb ، 0x57b8e0af ، 0x2464369b ، 0xf009b91e ، 0x5563911d ، 0x59dfa6a ، 0xd95a537f ، 0x207d5ba2 ، 0x2e5b9c5 ، 0x83260376 ، 0x6295cfa9 ، 0x11c81968 ، 0x4e734a41 ، 0xb3472dca ، 0x7b14a94a ، 0x1b52 ، 0xd60f573f ، 0xbc9b6e4 ، 0x2b60a476 ، 0x81e67400 ، 0x8ba6fb5 ، 0x571be91f ، 0xf296ec6b ، 0x2a0dd915 ، 0xB6636521 ، 0xc5855664 ، 0x53b02d5d ، 0xa99f8fa1 ، 0x8ba4799 ، 0x6e85076a} ؛ ثابت نهائي int sbox_init_2 [] = {0x4b7a70e9 ، 0xb5b32944 ، 0xdb75092e ، 0xc4192623 ، 0xad6e6b0 ، 0x49a7df7d ، 0x9cee60b8 ، 0x8fedb266 ، 0x6999a17ff ، 0x5664526c ، 0xc2b19ee1 ، 0x193602a5 ، 0x75094c29 ، 0xa0591340 ، 0xe4183a3e ، 0x3f54989a ، 0x5b429d65 0xa1d29c07 ، 0xefe830f5 ، 0x4d2d38e6 ، 0xf0255dc1 ، 0x4cdd2086 ، 0x8470eb26 ، 0x6382e9c6 ، 0x21ecc5e ، 0x9686b3f ، 0x3ebaefc9 ، 0x6b6a70a1 ، 0x687f3584 ، 0x52a0e286 ، 0xb79c5305 ، 0xaa500737 ، 0x3e07841c ، 0x7fdeae5c ، 0x8e7d44ec ، 0x5716f2b8 0xf01c1f04 ، 0x200b3ff ، 0xae0cf51a ، 0x3cb574b2 ، 0x25837a58 ، 0xdc0921bd ، 0xd19113f9 ، 0x7ca92ff6 ، 0x94324773 ، 0x22f54701 ، 0x37c2dadc ، 0xc8b57634 ، 0x9af3dda7 ، 0xa9446146 ، 0xfd0030e ، 0xeccc8c73e ، 0xa4751e41 ، 0xe238cd99 ، 0x3be0e2f ، 0x4e548b38 ، 0x4f6db908 ، 0x6f420d03 ، 0xf60a04bf ، 0x2cb81290 ، 0x24977c79 ، 0x5679b072 ، 0xbcaf89af ، 0xde9a71f ، 0xd9930 ، 0xdccf3f2e ، 0x5512721f ، 0x2e6b7124 ، 0x501adde6 ، 0x9f84cd87 ، 0x7a584718 ، 0x7408da17 ، 0xbc9f9abc ، 0xe94b7d8c ، 0xec7ac3a ، 0x63094366 ، 0xc464c3d2 ، 0xef1c1847 ، 0x3215d908 ، 0xdd433b37 ، 0x24c2ba16 ، 0x12a14d43 ، 0x2a65c451 ، 0x5094000 0x10314e55 ، 0x81ac77d6 ، 0x5f11199b ، 0x43556f1 ، 0xd7a3c76b ، 0x3c11183b ، 0x5924a509 ، 0xf28fe6ed ، 0x97f1fbfa ، 0x86e34570 ، 0xeae96fb1 ، 0x860e5e0a ، 0x5a3e2ab3 ، 0x771fe71c ، 0x4e3d06fa ، 0x2965dcb9 ، 0x99e71d0f ، 0x803e89d6 ، 0x5266. 0x9c10b36a ، 0xc6150eba ، 0x94e2ea78 ، 0xa5fc3c53 ، 0x1e0a2df4 ، 0xf2f74ea7 ، 0x361d2b3d ، 0x1939260f ، 0x19c27960 0xEbadfe6e ، 0xeac31f66 ، 0xe3bc4595 ، 0xa67bc883 ، 0xb17f37d1 ، 0x18cff28 ، 0xc332ddef ، 0xbe6c5aa5 ، 0x65582185 ، 0x6802 ، 0xdb2f953b ، 0x2aef7dad ، 0x5b6e2f84 ، 0x1521b628 ، 0x29076170 ، 0xecdd4775 ، 0x619f1510 ، 0x13cca830 ، 0xeb61bd96 0xb5735c90 ، 0x4c70a239 ، 0xd59e9e0b ، 0xcbaade14 ، 0xeecc86bc ، 0x60622ca7 ، 0x9cab5cab ، 0xb2f3846e ، 0x648b1eaf ، 0x19bdf0ca ، 0x655ABB50 ، 0x40685A32 ، 0x3C2AB4B3 ، 0x319EE9D5 ، 0XC021B8F7 ، 0x9B540B19 ، 0x875FA099 ، 0x95F7997E ، 0x623D7DA8 0x11ed935f ، 0x16681281 ، 0xe358829 ، 0xc7e61fd6 ، 0x96dedfa1 ، 0x7858ba99 ، 0x57f584a5 ، 0x1b227263 ، 0x9b83c3ff ، 0x532e3054 ، 0x8fd948e4 ، 0x6dbc3128 ، 0x58ebf2ef ، 0x34c6ffea ، 0xfe28ed61 ، 0xee7c3c73 ، 0x5d4a14d9 ، 0xe864b7e3 ، 0x42105d14 ، 0x45EE2B6 ، 0xa3aaabea ، 0xdb6c4f15 ، 0xfacb4fd0 ، 0xc742f442 ، 0xef6abbb5 ، 0x654f3b1d ، 0x41cd2105 ، 0xd81e799e ، 0x86854dc7 ، 0x3d816250 ، 0xcf62a1f2 ، 0x5b8d2646 ، 0xfc8883a0 ، 0xc1c7b6a3 ، 0x7f1524c3 ، 0x69cb7492 ، 0x47848a0b ، 0x5692b285 ، 0x1462b174 ، 0x23820e00 ، 0x58428d2a ، 0xc55f5ea ، 0x1dadf43e ، 0x233f7061 ، 0x3372f092 ، 0x8d937e41 ، 0xd65fecf1 0xcbee7460 ، 0x4085f2a7 ، 0xce77326e ، 0xa6078084 ، 0x19f8509e ، 0xe8efd855 ، 0x61d99735 ، 0xa969aa ، 0xc50c0c2 ، 0x5a04abfc ، 0x9e447a2e ، 0xc3453484 ، 0xfdd56705 ، 0xe1e9ec9 ، 0xdb73dbd3 ، 0x105588cd ، 0x675fda79 ، 0xe3674340 ، 0xc5c43465 0xf16dff20 ، 0x153e21e7 ، 0x8fb03d4a ، 0xe6e39f2b ، 0xdb83adf7} ؛ static النهائي int sbox_init_3 [] = {0xe93d5a68 ، 0x948140f7 ، 0xf64c261c ، 0x94692934 ، 0x411520f7 ، 0x7602d4f7 ، 0xbcf46b2e ، 0xd4a20068 ، 0x3320f46a ، 0x43b7d4b7 ، 0x500061af ، 0x1e39f62e ، 0x97244546 ، 0x14214f74 ، 0xbf8b8840 ، 0x4d95fc1d ، 0x96b591. 0xbfbc09ec ، 0x3bd9785 ، 0x7fac6dd0 ، 0x31cb8504 ، 0x96eb27b3 ، 0x55fd3941 ، 0xda2547e6 ، 0xabca0a9a ، 0x28507825 ، 0x530429f4 ، 0xe9b66dfb ، 0x68dc1462 ، 0xd7486900 ، 0x680ec0a4 ، 0x27a18dee ، 0x4f3ffea2 ، 0xe887ad8c ، 0xB58Ce00. 0xce78a399 ، 0x406b2a42 ، 0x20fe9e35 ، 0xd9f385b9 ، 0xee39d7ab ، 0x3b124e8b ، 0x1dc9faf7 ، 0x4b6d1856 ، 0x26a36631 ، 0xdd5b4332 ، 0x6841e7f7 ، 0xca7820fb ، 0xfb0af54e ، 0xd8feb397 ، 0x454056ac ، 0xba489527 ، 0x55533a3a ، 0x2083838d87 ، 0x55a867bc ، 0xa1159a58 ، 0xcca92963 ، 0x99e1db33 ، 0xa62a4a56 ، 0x3f3125f9 ، 0x5ef47e1c ، 0x9029317c ، 0xfdf8e802 ، 0x4272f7. 0x5282ce3 ، 0x95c11548 ، 0xe4c66d22 ، 0x48c1133f ، 0xc70f86dc ، 0x7f9c9ee ، 0x41041f0f ، 0x404779a4 ، 0x5d886e17 ، 0xf2bcc18f ، 0x41113564 ، 0x257b7834 ، 0x602a9c60 ، 0xdff8e8a3 ، 0x1f636c1b ، 0xe12b4c2 ، 0x2e1329e ، 0xaf664fd1 ، 0xcad18115 ، 0x333e92e1 ، 0x3b240b62 ، 0xeebeb922 ، 0x85b2a20e ، 0xe6ba0d99 ، 0xde720c8c ، 0x2da2f728 ، 0xd0127845 ، 0x95b794fd ، 0x647d0862 ، 0x5449a36f ، 0x877d48fa ، 0xc39dfd27 ، 0xf33e8d1e ، 0xa476341 ، 0x992eff74 ، 0x3a6f6eab ، 0xf4f8fd37 ، 0xa812dc60 ، 0x3a6f8 ، 0xdb6e6b0d ، 0xc67b5510 ، 0x6d672c37 ، 0x2765d43b ، 0xdcd0e804 ، 0xf1290dc7 ، 0xccc00ffa3 ، 0xb5390f92 ، 0x690fed0b ، 0xa091cf0b ، 0xd91555e3 ، 0xbb132f88 ، 0x515bad24 ، 0x7b9479bf ، 0x763bd6eb ، 0x37392eb3 ، 0xcc115979 ، 0x8026e297 0xc66a2b3b ، 0x12754ccc ، 0x782ef11c ، 0x6a124237 ، 0xb79251e7 ، 0x6a1bbe6 ، 0x4bfb6350 ، 0x1a6b1018 ، 0x11caedfa ، 0x3d25bd8 ، 0x44421659 ، 0xa121386 ، 0xd90cec6e ، 0xd5abea2a ، 0x64af674e ، 0xda86a85f ، 0xbbfe988 ، 0x64e4c3fe ، 0x9dbc8057 ، 0x6003604d ، 0xd1fd8346 ، 0xf6381fb0 ، 0x7745ae04 ، 0xd736fccc ، 0x83426b33 ، 0xf01eab71 ، 0xb0804187 ، 0x3c00e5e5f ، 0x55464299 ، 0xbf582e61 ، 0x4e58f48f ، 0xf2ddfda2 ، 0xf474ef38 ، 0x8789bdc2 ، 0x5366f9c3 ، 0xc8b38e74 ، 0xb475f255 ، 0x46f9c3 ، 0x7aeb2661 ، 0x8b1ddf84 ، 0x846a0e79 ، 0x915f95e2 ، 0x466e598e ، 0x20b45770 ، 0x8cd55591 ، 0xc902de4c ، 0xb90bace1 0x7574a99e ، 0xb77f19b6 ، 0xe0a9dc09 ، 0x662d09a1 ، 0xc4324633 ، 0xe85a1f02 ، 0x9f0be8c ، 0x4a99a025 ، 0x1d6efe10 ، 0x1ab93d1d ، 0xa186f20f ، 0x2868f169 ، 0xdcb7da83 ، 0x573906fe ، 0xa1e2ce9b ، 0x4fcd7f52 ، 0x50115e01 ، 0xa70683fa ، 0xa002b5c4 ، 0xde6d027 ، 0x773f8641 ، 0xc3604c06 ، 0x61a806b5 ، 0xf0177a28 ، 0xc0f586e0 ، 0x6058aa ، 0x30dc7d62 ، 0x11e69ed7 ، 0x23338338 ، 0xBBCBEE56 ، 0x90BCB6DE ، 0xEBFC7DA1 ، 0xCE591D76 ، 0x6F05E409 ، 0x4B7C0188 ، 0x39720A3D ، 0x7C927C24 ، 0x86E3725F ، 0x724D9D9D9D9D9 ، 0xd39eb8fc ، 0xed545578 ، 0x8fca5b5 ، 0xd83d7cd3 ، 0x4dad0fc4 ، 0x1e50ef5e ، 0xb161e6f8 ، 0xa28514d9 ، 0x6c5113c ، 0x362abfce ، 0xddc6c837 ، 0xd79a3234 ، 0x92638212 ، 0x670efa8e ، 0x406000e0} ؛ static نهائي int sbox_init_4 [] = {0x3a39ce37 ، 0xd3faf5cf ، 0xabc27737 ، 0x5ac52d1b ، 0x5cb0679e ، 0x4fa33742 ، 0xd3822740 ، 0x99bbeb 0xbf0f7315 ، 0xd62d1c7e ، 0xc700c47b ، 0xb78c1b6b ، 0x21a19045 ، 0xb26eb1be ، 0x6a366eb4 ، 0x5748ab2f ، 0xbc946e79 0x530ff8ee ، 0x468dde7d ، 0xd5730a1d ، 0x4cd04dc6 ، 0x2939bbdb ، 0xa9ba4650 ، 0xac9526e8 ، 0xbe5ee304 0x9A86EE22 ، 0xc089c2b8 ، 0x43242ef6 ، 0xa51e03aa ، 0x9cf2d0a4 ، 0x83c061ba ، 0x9bebe96a4d ، 0x8fe51550 ، 0xba645bd6 0x4ba99586 ، 0xef5562e9 ، 0xc72fefd3 ، 0xf752f7da ، 0x3f046f69 ، 0x77fa0a59 ، 0x80e4a915 ، 0x87b08601 ، 0x9b09e6ad ، 0x3b3e593 ، 0x9e34d797 ، 0x2cf0b7d9 ، 0x22b8b51 ، 0x96d5ac3a ، 0x17da67d ، 0xd1cf3ed6 ، 0x7c7d2d28 ، 0x1f9f25cf ، 0xadf2b89b ، 0xE029AC71 ، 0xE019A5E6 ، 0x47B0ACFD ، 0xed93fa9b ، 0xe8d3c48d ، 0x283b57cc ، 0xf8d56629 ، 0x79132e28 ، 0x785f0191 0xe3d35e8c ، 0x15056dd4 ، 0x88f46dba ، 0x3a16125 ، 0x564f0bd ، 0xc3eb9e15 ، 0x3c9057a2 ، 0x97271aec ، 0xa93a072a ، 0x1b3f6d9b ، 0xf59c66fb ، 0x26dcf319 ، 0x7533d928 ، 0xb15555555 ، 0x3563482 ، 0x8aba3cbb ، 0x28517711 ، 0xc20ad9f8 ، 0xabcc5167 ، 0xccad925f ، 0x3830dc8e ، 0x379d5862 ، 0x9320f991 ، 0xea7a90c2 ، 0xfb3e7bce ، 0x5121ce64 ، 0x774fbe32 ، 0xa8b6e37e ، 0xc3293d46 ، 0x48de5369 ، 0xa2ae0810 ، 0xdd6db224 ، 0x69852dfd ، 0x9072166 ، 0xb39a460a ، 0x6445c0dd ، 0x586cdecf ، 0x1c20c8ae ، 0x5bbf7dd ، 0x1b588d40 ، 0x6bb4e3bb ، 0xdda26a7e ، 0x3a59ff45 ، 0x3e350a44 ، 0xbcb4cdd5 ، 0x72eacea8 ، 0xfa6484bb ، 0x8d6612ae ، 0xbf3c6f47 ، 0xaec2771b ، 0xf64e6370 ، 0x740e0d8d ، 0xe75b1357 ، 0xf8721671 ، 0xaf537d5d ، 0x4040cb08 ، 0x4eb4e2cc ، 0x34d24666a ، 0x115af84 ، 0x95983a1d ، 0x6b89fb4 ، 0xce6ea048 ، 0x6f3b82 ، 0x3520ab82 ، 0x11a1d4b ، 0x277227f8 ، 0x611560b1 ، 0xe793333fdc ، 0xa08839e1 ، 0x51ce794b ، 0x2f32c9b7 ، 0xa01fbac9 ، 0xe01cc87e ، 0xbcc7d1f6 ، 0xcf0111c3 ، 0xa1e8aac7 ، 0x1a908749 0xD50ADA38 ، 0x339c32a ، 0xc6913667 ، 0x8df9317c ، 0xe0b12b4f ، 0xf79e59b7 ، 0x43f5bb3a ، 0xf2d519ff ، 0x27d9459c ، 0xf91fc71 ، 0x9b941525 ، 0xfae59361 ، 0xceb69ceb ، 0xc2a86459 ، 0x12baa8d1 ، 0xb6c1075e ، 0xe3056a0c ، 0x10d25065 ، 0xcb03a42 ، 0x1698db3b ، 0x4c98a0be ، 0x3278e964 ، 0x9f1f9532 ، 0xe0d392df ، 0xd3a0342b ، 0x8971f21e ، 0x1b0a7441 ، 0x4ba348c ، 0xc3120 ، 0xdf359f8d ، 0x9b992f2e ، 0xe60b6f47 ، 0xfe3f11d ، 0xe54cda54 ، 0x1edad891 ، 0xce6279cf ، 0xcd3e7e6f ، 0x1618b166 ، 0xfd2c1d05 ، 0xf6fb2299 ، 0xf523f357 ، 0xa6327623 ، 0x93a83531 ، 0x56cccd02 ، 0xacf08162 ، 0x5a75eb5 ، 0x6e163697 ، 0x88d273cc 0x81b949d0 ، 0x4c50901b ، 0x71c65614 ، 0xe6c6c7bd ، 0x327a140a ، 0x45e1d006 ، 0xc3f27b9a ، 0xc9a53fd ، 0x62a80f00 ، 0xbb25bfe2 ، 0x71126905 ، 0xB2040222 ، 0xB6CBCF7C ، 0xCD769C2B ، 0x53113ec0 ، 0x1640e3d3 ، 0x38abbd60 ، 0x2547adf0 ، 0xBA38209c ، 0x20756060 ، 0x85cbfe4e ، 0x8ae88dd8 ، 0x7aaaf9b0 ، 0x4cf9aa7e ، 0x1948c25c ، 0x2fb8a8c ، 0x1c36ae4 ، 0xd6ebe1f9 ، 0x90d4f869 ، 0x3f09252d ، 0xc208e69f ، 0xb74e6132 ، 0xce77e25b ، 0x578fdfe3 ، 0x3ac372e6} ؛ publicfishecb (byte bfkey []) {m_pbox = new int [18] ؛ لـ (int ni = 0 ؛ ni <18 ؛ ni ++) {m_pbox [ni] = pbox_init [ni] ؛ } m_sbox1 = new int [256] ؛ m_sbox2 = new int [256] ؛ m_sbox3 = new int [256] ؛ m_sbox4 = new int [256] ؛ لـ (int ni = 0 ؛ ni <256 ؛ ni ++) {m_sbox1 [ni] = sbox_init_1 [ni] ؛ m_sbox2 [ni] = sbox_init_2 [ni] ؛ m_sbox3 [ni] = sbox_init_3 [ni] ؛ m_sbox4 [ni] = sbox_init_4 [ni] ؛ } int nlen = bfkey.length ؛ if (nlen == 0) {return ؛ } int nkeypos = 0 ؛ int nbuild = 0 ؛ لـ (int ni = 0 ؛ ni <18 ؛ ni ++) {for (int nj = 0 ؛ nj <4 ؛ nj ++) {nbuild = nbuild << 8 | bfkey [nkeypos] & 0xff ؛ if (++ nkeypos == nlen) {nkeypos = 0 ؛ }} m_pbox [ni] ^= nbuild ؛ } lzero long = 0l ؛ لـ (int ni = 0 ؛ ni <18 ؛ ni += 2) {lzero = encryptblock (lzero) ؛ m_pbox [ni] = (int) (lzero >>> 32) ؛ m_pbox [ni + 1] = (int) (lzero & 0xffffffffl) ؛ } لـ (int ni = 0 ؛ ni <256 ؛ ni += 2) {lzero = encryptblock (lzero) ؛ m_sbox1 [ni] = (int) (lzero >>> 32) ؛ m_sbox1 [ni + 1] = (int) (lzero & 0xfffffffffl) ؛ } لـ (int ni = 0 ؛ ni <256 ؛ ni += 2) {lzero = encryptblock (lzero) ؛ m_sbox2 [ni] = (int) (lzero >>> 32) ؛ m_sbox2 [ni + 1] = (int) (lzero & 0xfffffffffl) ؛ } لـ (int ni = 0 ؛ ni <256 ؛ ni += 2) {lzero = encryptblock (lzero) ؛ m_sbox3 [ni] = (int) (lzero >>> 32) ؛ m_sbox3 [ni + 1] = (int) (lzero & 0xffffffffffl) ؛ } لـ (int ni = 0 ؛ ni <256 ؛ ni += 2) {lzero = encryptblock (lzero) ؛ m_sbox4 [ni] = (int) (lzero >>> 32) ؛ m_sbox4 [ni + 1] = (int) (lzero & 0xffffffffl) ؛ }}} blowfish public (كلمة مرور السلسلة) {messagedigest digest = null ؛ حاول {digest = messagedigest.getInstance ("sha1") ؛ Digest.update (password.getBytes ()) ؛ } catch (استثناء e) {log.error (e.getMessage () ، e) ؛ } m_bfish = new blowfishcbc (digest.digest () ، 0l) ؛ Digest.Reset () ؛ } السلسلة العامة encryptString (سلسلة splaintext) {long lcbciv ؛ Synchronized (m_rndgen) {lcbciv = m_rndgen.nextLong () ؛ } return encstr (splaintext ، lcbciv) ؛ } سلسلة خاصة encstr (سلسلة splaintext ، lnewcbciv long) {int nstrlen = splaintext.length () ؛ byte buf [] = new byte [(nstrlen << 1 & -8) + 8] ؛ int npos = 0 ؛ لـ (int ni = 0 ؛ ni <nstrlen ؛ ni ++) {char cactchar = splaintext.charat (ni) ؛ buf [npos ++] = (byte) (cactchar >> 8 & 0xff) ؛ buf [npos ++] = (byte) (cactchar & 0xff) ؛ } byte bpadval = (byte) (buf.length - (nstrlen << 1)) ؛ بينما (npos <buf.length) {buf [npos ++] = bpadval ؛ } m_bfish.setcbciv (lnewcbciv) ؛ m_bfish.encrypt (buf) ؛ Byte Newcbciv [] = New Byte [8] ؛ LongtobyTearray (lnewcbciv ، newcbciv ، 0) ؛ إرجاع bytestobinhex (newcbciv ، 0 ، 8) + bytestobinhex (buf ، 0 ، buf.length) ؛ } السلسلة العامة decryptstring (سلسلة sciphertext) {int nlen = sciphertext.length () >> 1 & -8 ؛ if (nlen <8) {return null ؛ } byte cbciv [] = new byte [8] ؛ int nnumofbytes = binhextobytes (sciphertext ، cbciv ، 0 ، 0 ، 8) ؛ if (nnumofbytes <8) {return null ؛ } m_bfish.setcbciv (cbciv) ؛ if ((nlen -= 8) == 0) {return "" ؛ } byte buf [] = new byte [nlen] ؛ nnumofbytes = binhextobytes (sciphertext ، buf ، 16 ، 0 ، nlen) ؛ if (nnumofbytes <nlen) {return null ؛ } m_bfish.decrypt (buf) ؛ int npadbyte = buf [buf.length - 1] & 0xff ؛ if (npadbyte> 8 || npadbyte <0) {npadbyte = 0 ؛ } nnumofbytes -= npadbyte ؛ if (nnumofbytes <0) {return "" ؛ } آخر {return bytearraytouncstring (buf ، 0 ، nnumofbytes) ؛ }} public void destroy () {m_bfish.cleanup () ؛ } static private bytearraytolong (byte buffer [] ، int nstartIndex) {return (long) buffer [nstartIndex] << 56 | (Buffer [nstartIndex + 1] & 255L) << 48 | (Buffer [nstartIndex + 2] & 255L) << 40 | (Buffer [nstartIndex + 3] & 255L) << 32 | (Buffer [nstartIndex + 4] & 255L) << 24 | (Buffer [nstartIndex + 5] & 255L) << 16 | (Buffer [nstartIndex + 3] & 255L) << 32 | (Buffer [nstartIndex + 4] & 255L) << 24 | (Buffer [nstartIndex + 5] & 255L) << 16 | (Buffer [nstartIndex + 6] & 255L) << 8 | المخزن المؤقت [nstartIndex + 7] & 255L ؛ } private static void longtobytearray (lvalue long ، byte buffer [] ، int nstartIndex) {buffer [nstartIndex] = (byte) (int) (lvalue >>> 56) ؛ Buffer [nstartIndex + 1] = (byte) (int) (lvalue >>> 48 & 255L) ؛ Buffer [nstartIndex + 2] = (byte) (int) (lvalue >>> 40 & 255L) ؛ Buffer [nstartIndex + 3] = (byte) (int) (lvalue >>> 32 & 255L) ؛ Buffer [nstartIndex + 4] = (byte) (int) (lvalue >>> 24 & 255L) ؛ Buffer [nstartIndex + 5] = (byte) (int) (lvalue >>> 16 & 255l) ؛ Buffer [nstartIndex + 6] = (byte) (int) (lvalue >>> 8 & 255l) ؛ العازلة [nstartIndex + 7] = (byte) (int) lvalue ؛ } private static long makelong (int nlo ، int nhi) {return (long) nhi << 32 | Nlo & 0xffffffffl ؛ } static int longlo32 (long lval) {return (int) lval ؛ } static int longhi32 (long lval) {return (int) (lval >>> 32) ؛ } السلسلة الثابتة الخاصة bytestobinhex (بيانات البايت [] ، int nstartpos ، int nnumofbytes) {StringBuffer sbuf = new StringBuffer () ؛ sbuf.setLength (nnumofbytes << 1) ؛ int npos = 0 ؛ لـ (int ni = 0 ؛ ni <nnumofbytes ؛ ni ++) {sbuf.setcharat (npos ++ ، hextab [data [ni+nstartpos] >> 4 & 0xf]) ؛ sbuf.setcharat (NPOS ++ ، Hextab [data [ni+nstartpos] & 0xf]) ؛ } return sbuf.toString () ؛ } static int binhextobytes (سلسلة sbinhex ، بيانات البايت [] ، int nsrcpos ، int ndstpos ، int nnumofbytes) {int nstrlen = sbinhex.length () ؛ int novailbytes = nstrlen - nsrcpos >> 1 ؛ if (navailbytes <nnumofbytes) {nnumofbytes = novailbytes ؛ } int noutputCapacity = data.length - ndstpos ؛ if (nnumofbytes> noutputCapacity) {nnumofbytes = noutputCapacity ؛ } int nresult = 0 ؛ لـ (int ni = 0 ؛ ni <nnumofbytes ؛ ni ++) {byte bactbyte = 0 ؛ Boolean blconvertok = صحيح ؛ لـ (int nj = 0 ؛ nj <2 ؛ nj ++) {bactbyte << = 4 ؛ char cactchar = sbinhex.charat (nsrcpos ++) ؛ if (cactchar> = 'a' && cactchar <= 'f') {bactbyte | = (byte) (cactchar - 97) + 10 ؛ يكمل؛ } if (cactchar> = '0' && cactchar <= '9') {bactbyte | = (byte) (cactchar - 48) ؛ } آخر {blconvertok = false ؛ }} if (cactchar> = '0' && cactchar <= '9') {bactbyte | = (byte) (cactchar - 48) ؛ } آخر {blconvertok = false ؛ }} if (blconvertok) {data [ndstpos ++] = bactbyte ؛ nresult ++ ؛ }} إرجاع nresult ؛ } سلسلة ثابتة خاصة bytearraytouncstring (بيانات البايت [] ، int nstartpos ، int nnumofbytes) {nnumofbytes & = -2 ؛ int novailcapacity = data.length - nstartpos ؛ if (novailcapacity <nnumofbytes) {nnumofbytes = novailcapacity ؛ } StringBuffer SBUF = New StringBuffer () ؛ sbuf.setLength (nnumofbytes >> 1) ؛ int nsbufpos = 0 ؛ لـ (؛ nnumofbytes> 0 ؛ nnumofbytes -= 2) {sbuf.setcharat (nsbufpos ++ ، (char) (data [nstartpos] << 8 | data [nstartpos+1] & 0xff)) ؛ nstartpos += 2 ؛ } return sbuf.toString () ؛ } blowfishcbc m_bfish ؛ static العشوائي العشوائي الخاص = جديد عشوائي () ؛ char hexxtab النهائي الثابت [] = {'0' ، '1' ، '2' ، '3' ، '4' ، '5 ،' 6 '،' 7 '،' 8 '،' 9 '،' a '،' b '،' c '،' d '،' e '،' f '؛} ؛}لخص
ما سبق هو كل محتوى هذه المقالة حول تنفيذ الكود الكامل لخوارزمية تشفير الأسماك في لغة Java. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها.