Beberapa hari yang lalu, rumor tiba -tiba muncul di internet: kebocoran data 12g di timur tertentu, dan pada akhirnya, saya tidak menyangkalnya dalam sebuah pernyataan, dan hampir tidak diterima. Sudah ada banyak orang yang mengatakan apa dampaknya pada orang biasa dan bagaimana melakukannya, jadi saya tidak akan bergabung dalam kesenangan. Mari kita bicara tentang algoritma enkripsi praktis yang saya pikir secara pribadi relatif aman saat ini: blowfish.
Sebelum memasukkan kode, izinkan saya berbicara tentang karakteristik algoritma enkripsi blowfish:
1. Enkripsi simetris, yaitu, kunci terenkripsi dan kunci yang didekripsi adalah sama;
2. Hasilnya setelah setiap enkripsi berbeda (ini adalah sesuatu yang lebih saya hargai);
3. Reversibel, berbeda dari algoritma abstrak seperti MD5 yang diperkenalkan dalam artikel saya sebelumnya, reversibel;
4. Kecepatan cepat, proses enkripsi dan dekripsi pada dasarnya terdiri dari operasi instruksi ADD dan XOR;
5. GRATIS, siapa pun dapat menggunakannya secara gratis tanpa membayar biaya hak cipta;
6. Blowfish hanya dapat mengenkripsi dan mendekripsi 8 byte data sekaligus;
Algoritma blowfish adalah algoritma enkripsi paket simetris. Inti dari algoritma terletak pada generasi subkey, yang memperluas kunci variabel-panjang ke dalam array subkey dengan panjang total 4168byte. Sejumlah besar subkey digunakan dalam algoritma, dan subkey bergantung pada kunci pengguna. Dalam proses penambahan/dekripsi yang sebenarnya, array subkey yang diperbarui digunakan, yaitu array P dan kotak S. Algoritma blowfish memiliki fungsi enkripsi inti: bf_en (). Input fungsi ini adalah informasi plaintext 64-bit. Setelah perhitungan, itu adalah output dalam bentuk informasi ciphertext 64-bit. Untuk mengenkripsi informasi menggunakan algoritma blowfish, diperlukan dua proses: preprocessing utama dan enkripsi informasi. Demikian pula, dekripsi juga membutuhkan dua proses, preprocessing utama dan dekripsi informasi.
Kunci sumber algoritma blowfish - pbox dan sbox diperbaiki. Jika kami ingin mengenkripsi pesan, kami perlu memilih kunci dan menggunakan kunci ini untuk mengubah PBox dan Sbox untuk mendapatkan KEY_PBOX dan KEY_SBOX untuk digunakan untuk langkah berikutnya dari enkripsi informasi. Hal yang sama berlaku untuk dekripsi. Karena blowfish adalah algoritma enkripsi simetris, pihak dekripsi menghasilkan KEY_BOX dan KEY_SBOX yang diperlukan untuk dekripsi berdasarkan kunci setelah mendapatkan kunci. Mengenkripsi dan mendekripsi informasi yang sama, dan tombol yang berbeda yang dipilih akan mengarah pada ciphertext yang berbeda. Oleh karena itu, kunci algoritma blowfish terletak pada pilihan kunci dan kerahasiaan.
Karena algoritma blowfish menggunakan kunci panjang variabel, ini tidak hanya membawa kenyamanan besar bagi pengguna tetapi juga memiliki bahaya tersembunyi. Karena inti dari enkripsi/dekripsi algoritma terletak pada pemilihan dan kerahasiaan kunci, dalam aplikasi yang sebenarnya, beberapa kunci yang lemah sering digunakan untuk mengenkripsi sumber daya informasi, yang menghasilkan risiko keamanan yang besar.
Berikutnya adalah bagian terpenting, implementasi algoritma enkripsi blowfish:
Paket cn.bridgeli.encrypt; public enum blowfishManager {bridgeli_cn ("bridgeli_cn!@#$ ABC123_"); Private BlowFishManager (String Secret) {this.blowfish = new blowfish (Secret); } blowfish blowfish pribadi; public blowfish getBlowFish () {return blowfish; } / ** * decrypt * @param sciphertext * @return * / public string decryptString (string sciphertext) {return this.getBlowFish (). DecryptString (sciphertext); } / ** * Encrypt * @param splaintext * @return * / public string encryptString (string splaintext) {return this.getBlowFish (). EncryptString (splaintext); } public static void main (string [] args) {string encryptString = blowfishManager.bridgeli_cn.encryptString (10 + ""); System.out.println (encryptString); String decryptString = blowfishManager.bridgeli_cn.decryptString (encryptString); System.out.println (DecryptString); }}Ini adalah antarmuka eksternal, yang sangat mudah digunakan dan ramah pengguna. Berikut ini adalah implementasi spesifik dari algoritma:
Paket cn.bridgeli.encrypt; impor java.security.messagedigest; import java.util.random; impor org.slf4j.logger; impor org.slf4j.loggerFactory; blowfish kelas publik {private static logger logger logger = loggerFactory.getger; get logger. kelas statis private blowfishcbc memperluas blowfishecb {public void setcbciv (long lnewcbciv) {m_lcbciv = lnewcbciv; } public void setCbCiv (byte newcbciv []) {m_lcbciv = blowfish.bytearraytolong (newcbciv, 0); } @Override public void cleanup () {m_lcbciv = 0l; super.cleanup (); } private Long EncryptBlockCBC (long lPlainBlock) {lPlainBlock ^= m_lcbciv; lPlainBlock = super.encryptBlock (lPlainBlock); return m_lcbciv = lPlainBlock; } private long decryptblockcbc (lcipherblock panjang) {long ltemp = lcipherblock; lcipherblock = super.decryptblock (lcipherblock); lcipherblock ^= m_lcbciv; m_lcbciv = ltemp; return lcipherblock; } public void encrypt (byte buffer []) {int nlen = buffer.length; untuk (int ni = 0; ni <nlen; ni += 8) {long ltemp = blowfish.bytearraytolong (buffer, ni); ltemp = encryptblockcbc (ltemp); Blowfish.longtobytearray (ltemp, buffer, ni); }} public void decrypt (buffer byte []) {int nlen = buffer.length; untuk (int ni = 0; ni <nlen; ni += 8) {long ltemp = blowfish.bytearraytolong (buffer, ni); ltemp = decryptblockcbc (ltemp); Blowfish.longtobytearray (ltemp, buffer, ni); }} long m_lcbciv; publik blowfishcbc (byte bfkey []) {super (bfkey); setCBCIV (0L); } public blowfishcbc (byte bfkey [], long linitcbciv) {super (bfkey); setCBCIV (linitcbciv); } public blowfishcbc (byte bfkey [], byte initcbciv []) {super (bfkey); setCBCIV (initcbciv); }} kelas statis privat blowfishecb {public void cleanup () {for (int ni = 0; ni <18; ni ++) {m_pbox [ni] = 0; } untuk (int ni = 0; ni <256; ni ++) {m_sbox1 [ni] = m_sbox2 [ni] = m_sbox3 [ni] = m_sbox4 [ni] = 0; }} Dilindungi Long EncryptBlock (Long lPlainBlock) {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]); } Disripsi Long DecryptBlock (Long 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 []; static final int pbox_init [] = {0x243f6a88, 0x85a308d3, 0x13198a2e, 0x3707344, 0xa4093822, 0x299f31d0, 0x82EFA98, 0XEC4E6C89, 0X82EFA98, 0XEC4E6C89, 0X82EFA98, 0XEC4E6C89, 0X8289, 0XEC4E6C89, 0X8289, 0XEC4E6C89.1 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979717, 0x9216d5d9, 0x89797917; static final int sbox_init_1 [] = {0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7c7f9, 0xba7c9045, 0xf12c7c7f99, 0xba7c9045, 0xf12c7c7c7, 0xb3916cf7, 0x801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0xd95748f, 0x728EB658, 0xD95748F, 0x728EB658, 0XD95748F, 0x728EB658, 0XD95748F, 0x728EB658, 0XD95748 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xB8DB38EF, 0x8e79DCB0, 0XB8DB38EF, 0X8E79DCB0, 0XB8DB38EF, 0X8E79DCB0, 0xB8DB38EF, 0x8E79DCB0.10.10.18 0xB01E8A3E, 0xD71577C1, 0XBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E8144440404040404489862, 0x63E8144444440404489862, 0x63E81444444404489862, 0x63E81444444894, 0x63E81444448982, 0x63E814448489 0xB4CC5C34, 0x1141E8CE, 0XA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0X741831F6, 0XCE5C3E16, 0x741831F6, 0XCE5C3C3E16, 0x74187, 0xCE5C3E16, 0x74187. 0x6c24cf5c, 0x7a3331, 0x2855af, 0xc4bfe, 0x66, 0x6, 0x61, 0x, 0x6, 0x, 0x6, 0x, 0x6, 0x, 0x6, 0x6, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x. 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0xf6d6ff3, 0x83f44239, 0x2e0b4482, 0x83f44239, 0x2e0b4482, 0x8848484239, 0x2e0b4482, 0x848239, 0x2e0b4482, 0x848239, 0x2e0b4482, 0x8482, 0x2e0b4482, 0x8482, 0x2e0B4482, 0x8482, 0x2E0B4482, 0X2E0B4482, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd38f0, 0x6a51a0d2, 0xd85442f68, 0x960fa728, 0xAb511333, 0x960fa728, 0xAb511333, 0x960fa728, 0xAB511133, 0x960FA728, 0XAB51133, 0x960 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3B8F9FB4, 0x7d84a5c3, 0x3b8b4, 0x7d84a5c3, 0x3b8b4, 0x7d84a5c3, 0x4b8fb4, 0x7d84a5c3, 0x4b8 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x75372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x4c006ba, 0xc1a94fb6, 0x4, 0x4c006ba, 0xc1a94fb6, 0x4c006ba, 0xc1a94fb6, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x1a60320a, 0xd6a100c6, 0x4029 0xfb1fa3cc, 0x8ea5e9f8, 0xdb322f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552Ab, 0x323db5fa, 0xfd238760, 0x323, 0x9E5C57BB, 0XCA6F8CA0, 0X1A87562E, 0XDF1769DB, 0XD542A8F6, 0X287EFFC3, 0XAC6732C6, 0X8C4F5573, 0X695B27B0B0, 0X8C4F5573, 0X695B27B0B0,, 0X8C4F5573, 0X6955B27B0,, 0X8C4F5573, 0x6955B27B0, 0XB0, 0XB0B0, 0XB0B0, 0XB0B0, 0X6, 0X695B27B0, 0XB0B0, 0XB0B0, 0X6955B0, 0XB0, 0X695B27B0, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xCEE4C6E8, 0XEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0XAE909198, 0XAAD8E71, 0X6B93 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0x4fad5ea0, 0x6888fc, 0x4fad5ea0, 0x68888c, 0x4fad5ea0, 0x6888c, 0x4fad5ea0, 0x6888c, 0x4FAD5EA0, 0X6888C31C, 0X4FAD5EA0, 0x6888 0x2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xB4A84FE0, 0XCE2E299, 0XB4A84FE0, 0XCE2E299, 0XB4A84FE0, 0XCE23 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xe7.10e 0cc7, 0xfb9d35cf, 0xc75442f5, 0xfb9d35cf, 0xc75442f5, 0xfb9d35cf, 0xc75442f5, 0xfb9d35cf, 0xc75442f5, 0xfb9d35cf, 0xc7542f5, 0xfb9d35cf, 0xC7442F5, 0xfb9d3Cf, 0xEF7 0xd6411bd3, 0xae1e7e49, 0x250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x556391d, 0x59df 0xd95a537f, 0x207d5ba2, 0x2e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a41, 0xb3472dca, 0x7b14a94a4a41, 0xb3472dca, 0x7b14b14a94a4a, 0xb3472dca, 0x7b14b14a94a4a, 0xb3472dca, 0x7b14b14a94a4a41 0xd60f573f, 0xbc9b6e4, 0x2b60a476, 0x81e67400, 0x8ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0d915, 0xb6666521, 0x2a7a0d915, 0xB66666521, 0x2a7a0 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x8ba4799, 0x6e85076a}; static final int sbox_init_2 [] = {0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9Ce60b8, 0x8fedb2 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f5498a, 0x5b429D65D65D65, 0x3F54989A, 0x5B429D65D65D65, 0x3F54989A, 0x5B429D65D65D65D65D65D65D65D65D64989 0xA1D29C07, 0XEFE830F5, 0X4D2D38E6, 0XF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0X21ECC5E, 0x9686B3F, 0X91, 0x21ECC5E, 0X96866B3F, 0X91B3F, 0X91B3F, 0X91B3F, 0X21B3F, 0X21B3F, 0X91B3F, 0X91B3F, 0X91B3F, 0x96B3F, 0X21B3F, 0X21B3F, 0x96B3F, 0X21 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7Ca92ff6, 0x9432473, 0x222f6, 0x9432473, 0x722F6, 0x9432473, 0x722F6, 0x9432473, 0x72F94, 0X9432473, 0x72F9, 0x943, 0x92FF9, 0x94A. 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0xfd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3211818cd99, 0x3BEA0E2F, 0X380B99, 0x3BEA0E2F, 0X380B99, 0x3BEA0E2F, 0x380 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a7771f, 0xbcaf89af, 0xde9a7771f, 0xbcaf89af, 0xde9a7771f, 0xbcaf89af, 0xde9a7771f, 0xbcaf89af, 0xde9a7771f, 0xbcaf89af, 0xde9a777771 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x43556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0xf28fe6ed, 0x97f1fbfa, 0xf28fe6ed, 0x97f1fbfa, 0x21 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c279660, 0x1939260f, 0x19c279660, 0x1939260f, 0x19c279660, 0x1939260f, 0x19c279660, 0x1939260 0xebadfe6e, 0xeAc31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x18cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0xbe6c5aa5, 0x655882185, 0xbe688888885, 0xbe6888885, 0xbe6188, 0xbe6188, 0xbe6188, 0xbe68188, 0xbe61 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, 0xecdd4775, 0x619f1510, 0x1CA830, 0XEB61BD96, 0X344430, 0XEB61BD96, 0X344430 0xb5735c90, 0x4c70a239, 0xd59e9b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19B2F3846E, 0x648b1eaf, 0x1919.9B2F3846E, 0x648b1eaf, 0x19B2F3846E, 0x648b1eaf, 0x19191919 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623da8da8, 0x95f797e, 0x623da8da8, 0x95f797e, 0x623da8da8da8, 0x95f797e, 0x623da8da8da8, 0x98f797e, 0x623da8da8da8, 0x623da8da8, 0x623da8da8da8da8, 0x11ed935f, 0x16681281, 0xe358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1b227263, 0x9b83c3ff, 0x1b227263, 0x9b83c3ff, 0x1b227263, 0x9b8c3ff, 0x1b227263, 0x9b8b8cs 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5105, 0xe8664b7e3, 0x514d9, 0xe8664b7e3, 0x514d9, 0xe8664b7e3, 0x14d9, 0xe864b7e3, 0x14d9, 0xe864b7e3, 0x45EE2B6, 0XA3AAABEA, 0XDB6C4F15, 0XFACB4FD0, 0XC742F442, 0XEF6ABBB5, 0X654F3B1D, 0X41CD2105, 0XD81E799E, 0x41CD2105, 0XD81E79E, 0X86684, 0xD81E799E, 0x41CD2105, 0xD81E79E, 0X86684, 0XD81E79E, 0X41CD2105, 0XD81E, 0X8684, 0X8684, 0x41 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b7492, 0x47848a0b, 0x5692b2b7492, 0x47848a0b, 0x5692b2b285, 0x47848a0b, 0x5692b2b285, 0x47848a0b, 0x5692b2b285, 0x47848A0B, 0X5692B28192, 0x47848A0B, 0X5692B28192 0x1462b174, 0x23820e00, 0x58428d2a, 0xc55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0xa969A7AA, 0xC50C0C06C2, 0XA04 0x9e447a2e, 0xc3453484, 0xfdd56705, 0xe1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c4343465, 0xe3674340, 0xc5c4c43465, 0xe3674340, 0xc5c4c43465, 0xe3674340, 0xc5c4c4346, 0xe3674340, 0xc5c4c4346, 0xc5c4346, 0xc5c4346, 0xc5c4346 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83Adf7}; static final int sbox_init_3 [] = {0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0x7106 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x4045fc1d, 0x96b591AF, 0x4045FC1D, 0x96B591AF, 0X4040FC1D, 0X96B59191AF, 0X4D95FC1D, 0X96B59191AF, 0X4D95FC1D, 0X96B59191AF, 0X4D95AD 0xbfbc09ec, 0x3bd9785, 0x7fac6d0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xAbca0A9A, 0x28507825, 0x5304222, 0xa24, 0x28507825, 0x5304, 0xa24, 0xa24, 0xaBCA2, 0x104825.1 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace, 0xb58ce006, 0x7af4d6b6, 0xaace, 0xb58ce006, 0x7af4d6b6, 0xaAcdal 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a366631, 0x4b6d1856, 0x26a36636,, 0x4b6d1856, 0x26a36636,, 0x4b6d1856, 0x26a366636, 0x4b6d1856, 0x26a366636, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x4272f70, 0x80bb155c, 0x5282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x7f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0xe12b4c2, 0x2e1329e, 0xaf664fd1, 0x2e181, 0xaf664fd1,, 0x2e181, 0xaF664FD1, 0X2E181, 0xAF664FD1, 0xAFD1, 0xAFD1, 0xAFD1, 0xAFD1, 0xAFD1, 0xAFD1, 0xAFD1, 0xAFD1, 0xAFD1, 0XAFD1, 0XAFD1, 0xAFD1, 0xAF664FD1, 0xAFD1, 0XAFD1, 0XAFD1, 0XAF64FD1, 0XAF64FD1, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127844, 0x95b79494fd, 0xd0127844, 0x95b79494fd, 0xd01278445, 0x95b79494fd, 0xd01278445, 0x95b79494fd04fd0127844, 0x95B79494FD0284FD027844, 0X95B79494FD04FD027 0x5449A3F, 0x877D4fa, 0xc39dfd27, 0xf3, 0x, 0xa4, 0x, 0x, 0xf4fd37, 0xA8112Dc6, 0xf4f8fd37, 0xA8112Dc6, 0xf4F8Fd37, 0xA8112DC6, 0XF4F8FD37, 0XA8112DC6, 0XF4F8FD37, 0XA8112D, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xA091CF0B, 0xD915AA3, 0XBB132F88, 0x515BAD24, 0x7B947BF, 0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xCC115979, 0x8026E297, 0xCC115979, 0x8026E297, 0xCC11979, 0x80267, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x6a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caEdfa, 0x3d21b1018, 0x11caedfa, 0x3d21B1018, 0x11caEdfa, 0x3d21B1018, 0x11caEdfa, 0x3d21B1018, 0x11caEDFA, 0x3d25B1018, 0x11caEDFA, 0x3d21B1018, 0x11caEDFA, 0x3d21 0x44421659, 0xa121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0x64, 0x986, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x48, 0xBC8057, 0XBC8057, 0x6 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01ab71, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187, 0x3c005f, 0xb0804187 yang 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f2, 0xc8b38e74, 0xb475f2, 0xc8b38e74, 0xb475f2, 0xc8b38e74, 0xb475f2, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd5551, 0xc902de4c, 0xb90bace1, 0xc902de4c, 0xb90bace11, 0xc902de4c, 0xb90bace11, 0xc902de4c, 0xb90bace11, 0xc902de4c, 0xb90bace11, 0xc902de4c, 0xB90Bace11 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x9f0be8c, 0x4a999A025, 0x1d6efe10, 0x4a99A025, 0x1d6efe10, 0x4a99A025, 0x1d6efe10, 0x4a99925, 0x1d6efe10, 0x4a99925, 0x1d6efe10, 0x4a99925, 0x1d6efe10 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0xa70683fa, 0xa002b5c4, 0xa706883fa, 0xa002b5c4, 0xa706883 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x6058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xBBCBEE56, 0X90BCB6DE, 0XEBFC7DA1, 0XCE591D76, 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7c927c24, 0x86e3725f, 0x7c927c24, 0x866e3725f, 0x7C927C24, 0x866E3725, 0x7227C24, 0x866E3725F, 0X7227C24, 0x866E3725, 0x86E3725, 0x86E3725, 0x86E3725F, 0x86E3725, 0x86E3725, 0x86E3725F, 0x86E3725F, 0x86E3725F, 0x86E3725F, 0x86E3725242 0xD39EB8FC, 0XED54578, 0X8FCA5B5, 0XD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51113C, 0x6F8, 0XA28514D9, 0X6C51113C, 0x6F8, 0XA28514D9, 0X6C51113C, 0x6F8, 0XA28514D9, 0X6C5113C, 0XA28514D9, 0X6C5113C, 0XA28514D9, 0X6C5113C, 0XA2851 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0}; static final int sbox_init_4 [] = {0x3a39ce37, 0xd3faf5cf, 0xAbc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bc9, 0xd3822740, 0x99bc9bc9, 0xd3822740, 0x99bc9bc9bc9, 0xd3822740, 0x99BC9BC9, 0XD382740, 0X99BC9BC9, 0XD382740, 0X999 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbee304, 0xa1fad5f0, 0x6a2d5.3304, 0xa1fad5f0, 0x6a2d5.3294, 0xa1fad5f0, 0x6a2d5.3 0x9A86E22, 0xC089C2B8, 0X43242EF6, 0XA51E03AA, 0X9CF2D0A4, 0X83C061BA, 0X9BE96A4D, 0X8FE51550, 0XBA645BD6, 0X8FE51550, 0XBA645BD6, 0X8FE51550, 0XBA645BD6, 0X8FE51550, 0XBA645BD6, 0X8FE51550 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6e6ad, 0x87b08601, 0x9b09e6e6ad, 0x87b08601, 0x9b09e6e6ad, 0x87b08601, 0x9b09e6ad, 0x87b08601, 0x9b09e6e6ad, 0x87b08601, 0x9b09e6ad, 0x87b08601, 0x9b09e6ad, 0x9e34d797, 0x2cf0b7d9, 0x22b8b51, 0x96d5ac3a, 0x17da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f019191, 0x79132e28, 0x785f019191, 0x79132e28, 0x785f019191, 0x79132e28, 0x785f019191919191919191919191919191919191919191919191 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x3a16125, 0x564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x3563482, 0x8AbA3CBB, 0x2851711, 0xc20ad9f8, 0xAbcc5117, 0xcccad 0xc20ad9f8, 0xAbcc5117, 0xcccad 0xc19f8, 0xAbcc5117, 0xccad, 0xABCCCA87, 0XC192, 0xABCCC517, 0xC19217171 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d4d46, 0xa8b6e37e, 0xc3293d46, 0xa814.1 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x9072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6BB4E3BB, 0XDDA26A7E, 0x3A59FF45, 0X3E350A44, 0XBCB4CDD5, 0X72EACEA8, 0XFA6484BB, 0X8D6612AE, 0xBF3C6F4, 0X8D6612AE, 0XBF3C6C6F4, 0XAEC2771B, 0XF64E6370, 0x740E0D8D, 0XE75B1357, 0xF8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d24666666666666666666666666628, 0x4EB4E2CC, 0x34D24666646666666628, 0x4EB4E2CC, 0X34D246666666666 0x95983a1d, 0x6b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520AB82, 0x11a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb34444444444444444, 0xB3444444, 0x6111560b1, 0xe793fdc, 0xb3 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa4aAc7, 0x1a908749, 0xa44aAc7, 0x1a908749, 0xa444Ac7, 0x1a908749, 0xa444908749, 0xA44AC7, 0x1a908749, 0xA44908749, 0xA44908749, 0xA449, 0xA44908749, 0xA449, 0XA4AAC7, 0x1 0xd50ada38, 0x339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0xf91fc71, 0x9b941525, 0xfae59361, 0xeb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a446a0c, 0x10d25065, 0xcb03446a0c, 0x10d25065, 0xcb0344446 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a74441, 0x4ba33341e, 0x1b0a7441, 0x4ba333341e, 0x1b0a7441, 0x4ba33333481 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0xfe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0x6e163697, 0x88d273cc, 0x6e163697, 0x88d273cc, 0x6e163697, 0x88d273c, 0x6e163697, 0x88d273c, 0x6e163697, 0x88D273D273D273D2, 0X6E163697, 0X88D273D273D2, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbbb25bfe2, 0x62a80f00, 0xbbb25bfe2bfe2, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77771, 0xF746CE76, 0XBA38209C, 0xF746CE76, 0XBA38209C, 0XF746, 0XBA38209C, 0XF746, 0XBA38209 0x85cbfe4e, 0x8AE88DD8, 0x7AAAF9B0, 0X4CF9AA7E, 0x1948c25c, 0x2fb8a8c, 0x1c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa614, 0x90d4f869, 0xd61f9, 0x90d4f869, 0xd6ebe1f9, 0x90d4f869, 0xD6190 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6}; blowfishecb publik (byte bfkey []) {m_pbox = new int [18]; untuk (int ni = 0; ni <18; ni ++) {m_pbox [ni] = pbox_init [ni]; } m_sbox1 = int baru [256]; m_sbox2 = int baru [256]; m_sbox3 = int baru [256]; m_sbox4 = int baru [256]; untuk (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; untuk (int ni = 0; ni <18; ni ++) {untuk (int nj = 0; nj <4; nj ++) {nbuild = nbuild << 8 | bfkey [nkeypos] & 0xff; if (++ nkeypos == nlen) {nkeypos = 0; }} m_pbox [ni] ^= nbuild; } long lzero = 0l; untuk (int ni = 0; ni <18; ni += 2) {lzero = encryptblock (lzero); m_pbox [ni] = (int) (lzero >>> 32); m_pbox [ni + 1] = (int) (lzero & 0xffffffffl); } untuk (int ni = 0; ni <256; ni += 2) {lzero = encryptblock (lzero); m_sbox1 [ni] = (int) (lzero >>> 32); m_sbox1 [ni + 1] = (int) (lzero & 0xfffffffffl); } untuk (int ni = 0; ni <256; ni += 2) {lzero = encryptblock (lzero); m_sbox2 [ni] = (int) (lzero >>> 32); m_sbox2 [ni + 1] = (int) (lzero & 0xfffffffffl); } untuk (int ni = 0; ni <256; ni += 2) {lzero = encryptblock (lzero); m_sbox3 [ni] = (int) (lzero >>> 32); m_sbox3 [ni + 1] = (int) (lzero & 0xffffffffffl); } untuk (int ni = 0; ni <256; ni += 2) {lzero = encryptblock (lzero); m_sbox4 [ni] = (int) (lzero >>> 32); m_sbox4 [ni + 1] = (int) (lzero & 0xffffffffl); }}} blowfish publik (kata sandi string) {MessageSmentigest Digest = null; coba {digest = messageSment.getInstance ("sha1"); Digest.update (kata sandi.getbytes ()); } catch (exception e) {log.error (e.getMessage (), e); } m_bfish = new blowfishcbc (digest.digest (), 0l); Digest.reset (); } public String encryptString (String splaintext) {long lcbciv; disinkronkan (m_rndgen) {lcbciv = m_rndgen.nextLong (); } return encstr (splaintext, lcbciv); } private string encstr (string splaintext, long lnewcbciv) {int nstrlen = splaintext.length (); byte buf [] = byte baru [(nstrlen << 1 & -8) + 8]; int npos = 0; untuk (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)); while (npos <buf.length) {buf [npos ++] = bpadval; } m_bfish.setcbciv (lnewcbciv); m_bfish.encrypt (buf); byte newcbciv [] = byte baru [8]; longtobytearray (lnewcbciv, newcbciv, 0); return bytestobinhex (newcbciv, 0, 8) + bytestobinhex (buf, 0, buf.length); } public String decryptString (string sciphertext) {int nlen = sciphertext.length () >> 1 & -8; if (nlen <8) {return null; } byte cbciv [] = byte baru [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 [] = byte baru [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 ""; } else {return bytearraytouncstring (buf, 0, nnumofbytes); }} public void dashing () {m_bfish.cleanup (); } private static long bytearraytolong (buffer byte [], 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 | buffer [nStartIndex + 7] & 255L; } private static void longtobyTeArray (long lvalue, 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); buffer [nStartIndex + 7] = (byte) (int) lvalue; } private static long makelong (int nlo, int nhi) {return (long) nhi << 32 | NLO & 0xFFFFFFFFFL; } private static int longlo32 (long lval) {return (int) lval; } private static int longhi32 (long lval) {return (int) (lval >>> 32); } private static string bytestoBinHex (data byte [], int nStartpos, int nnumofbytes) {stringBuffer sbuf = stringBuffer baru (); sbuf.setlength (nnumofbytes << 1); int npos = 0; untuk (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 (); } private static int binhextobytes (string sbinhex, data byte [], int nsrcpos, int ndstpos, int nnumofbytes) {int nstrlen = sbinhex.length (); int navailbytes = nstrlen - nsrcpos >> 1; if (navailbytes <nnumofbytes) {nnumofbytes = navailbytes; } int noutputCapacity = data.length - ndstpos; if (nnumofbytes> noutputCapacity) {nnumofbytes = noutputCapacity; } int nresult = 0; untuk (int ni = 0; ni <nnumofbytes; ni ++) {byte bactbyte = 0; boolean blconvertok = true; untuk (int nj = 0; nj <2; nj ++) {bactbyte << = 4; char cactchar = sbinhex.charat (nsrcpos ++); if (cactchar> = 'a' && cactchar <= 'f') {bactbyte | = (byte) (cactchar - 97) + 10; melanjutkan; } if (cactchar> = '0' && cactchar <= '9') {bactbyte | = (byte) (cactchar - 48); } else {blconvertok = false; }} if (cactchar> = '0' && cactchar <= '9') {bactbyte | = (byte) (cactchar - 48); } else {blconvertok = false; }} if (blconVertOK) {data [ndstpos ++] = bactbyte; nresult ++; }} return nResult; } private static string bytearraytouncstring (data byte [], int nStartpos, int nnumofbytes) {nnumofbytes & = -2; int navailcapacity = data.length - nStartpos; if (navailcapacity <nnumofbytes) {nnumofbytes = navailcapacity; } StringBuffer SBUF = StringBuffer baru (); sbuf.setlength (nnumofbytes >> 1); int nsbufpos = 0; untuk (; nnumofbytes> 0; nnumofbytes -= 2) {sbuf.setcharat (nsbufpos ++, (char) (data [nstartpos] << 8 | data [nStartpos+1] & 0xff))); nStartpos += 2; } return sbuf.tostring (); } private blowfishcbc m_bfish; private static random m_rndgen = random baru (); static final char hextab [] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};}Meringkaskan
Di atas adalah semua konten artikel ini tentang mengimplementasikan kode lengkap algoritma enkripsi blowfish dalam bahasa Java. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya.