数日前、インターネットに突然噂が現れました。特定の東部で12gのデータリークがあり、最終的には声明でそれを否定せず、ほとんど認められませんでした。この問題が普通の人々にどのような影響を与え、それを行うかを言っている人はすでにたくさんいるので、私は楽しみに参加しません。私が個人的には比較的安全だと思っている実用的な暗号化アルゴリズムについて話しましょう:ブローフィッシュ。
コードを入力する前に、ブローフィッシュ暗号化アルゴリズムの特性について話させてください。
1。対称暗号化、つまり、暗号化されたキーと復号化されたキーは同じです。
2。各暗号化の後の結果は異なります(これは私がもっと感謝するものです)。
3.私の前の記事で紹介したMD5などの抽象アルゴリズムとは異なる可逆的で、それは可逆的です。
4.高速、暗号化と復号化プロセスは、基本的にADDおよびXOR命令操作で構成されています。
5.無料、誰でも著作権料を支払うことなく無料で使用できます。
6。ブローフィッシュは、一度に8バイトのデータを暗号化および復号化できます。
ブローフィッシュアルゴリズムは、対称パケット暗号化アルゴリズムです。アルゴリズムのコアは、サブキーの生成にあり、これにより、可変長キーを4168byteの全長のサブキーアレイに拡張します。アルゴリズムでは多数のサブキーが使用されており、サブキーはユーザーキーに依存しています。実際の追加/復号化プロセスでは、更新されたサブキーアレイ、つまりPアレイとSボックスが使用されます。 BlowFishアルゴリズムには、暗号化関数がコア:BF_EN()があります。この関数の入力は64ビットのプレーンテキスト情報です。計算後、64ビットの暗号文情報の形で出力されます。 Blowfishアルゴリズムを使用して情報を暗号化するには、2つのプロセスが必要です。キープレップアクスシングと情報暗号化。同様に、復号化には、主要な前処理と情報復号化の2つのプロセスも必要です。
BlowFishアルゴリズムのソースキー-PBoxとSBOXが固定されています。メッセージを暗号化する場合は、キーを選択し、このキーを使用してPBOXとSBOXを変換して、情報暗号化の次のステップに使用するKey_Pboxとkey_sboxを取得する必要があります。同じことが復号化にも当てはまります。 Blowfishは対称暗号化アルゴリズムであるため、復号化パーティは、キーを取得した後にキーに基づいて復号化に必要なkey_boxおよびkey_sboxを生成します。同じ情報を暗号化および復号化すると、選択された異なるキーが異なる暗号文につながります。したがって、ブローフィッシュアルゴリズムの鍵は、キーと機密性の選択にあります。
BlowFishアルゴリズムはさまざまな長さキーを使用しているため、これはユーザーに大きな利便性をもたらすだけでなく、危険を隠しています。アルゴリズムの暗号化/復号化のコアは、キーの選択と機密性にあるため、実際のアプリケーションでは、情報リソースの暗号化にいくつかの弱いキーがよく使用され、大きなセキュリティリスクが生じます。
次は最も重要な部分です。これは、ブローフィッシュ暗号化アルゴリズムの実装です。
パッケージcn.bridgeli.encrypt; public enum blowfishmanager {bridgeli_cn( "bridgeli_cn!@#$ abc123_"); Private Blowfishmanager(String Secret){this.blowfish = new Blowfish(Secret); }プライベートブローフィッシュブローフィッシュ; public blowfish getblowfish(){return blowfish; } / ** * decrypt * @param sciphertext * @return * / public string decryptString(string sciphertext){return this.getBlowfish()。 } / ** * encrypt * @param splaintext * @return * / public string encryptString(string splaintext){return this.getBlowfish()。 } 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); }}これは外部インターフェイスであり、非常に使いやすく、ユーザーフレンドリーです。以下は、アルゴリズムの特定の実装です。
パッケージcn.bridgeli.encrypt; import java.security.messagegest; import java.util.random; import org.slf4j.logger; import org.slf4j.loggeractory; public class blowfish {private static final logger log = loggerfactory.getlogger(blowfish); Private static class Blowfishcbcは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(long lcipherblock){long ltemp = lcipherblock; lcipherblock = super.decryptblock(lcipherblock); lcipherblock ^= m_lcbciv; m_lcbciv = ltemp; lcipherblockを返します。 } public void necrypt(byte buffer []){int nlen = buffer.length; for(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; for(int ni = 0; ni <nlen; ni += 8){long ltemp = blowfish.bytearraytolong(buffer、ni); ltemp = decryptblockcbc(ltemp); blowfish.longtobytearray(ltemp、buffer、ni); }} long m_lcbciv; public 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); }} private static class blowfishecb {public void cleanup(){for(int ni = 0; ni <18; ni ++){m_pbox [ni] = 0; } for(int ni = 0; ni <256; ni ++){m_sbox1 [ni] = m_sbox2 [ni] = m_sbox3 [ni] = m_sbox4 [ni] = 0; }}保護されたlong encryptblock(long lplainblock){int nhi = blonghi32(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]; blowfish.makelong(nhi、nlo ^ pbox [17]); }保護されたlong decryptblock(long lcipherblock){int nhi = blonghi32(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]; 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、 0x38d01377、0xbe5466cf、0x34e90c6c、0xc0ac29b7、0xc97c50dd、0x3f84d5b5、0xb5470917、0x9216d5d9、0x89797997979797979797979797979797979797979797979799797979797979979799797979797979799797979797979797979797979797979797979797979797979797979797979797979797979797979797 Static final int sbox_init_1 [] = {0xd1310ba6、0x98dfb5ac、0x2ffd72db、0xd01adfb7、0xb8e1afed、0x6a267e96、0xba7c9045、0xf12c7f99、0x24a1acf7999、0x24a 0x801f2e2、0x858efc16、0x636920d8、0x71574e69、0xa458fea3、0xf493d7e、0xd95748f、0x728eb658、0x718bcd58、0x82154ae、0x82154ae、0x82154ae、 0xc25a59b5、0x9c30d539、0x2af26013、0xc5d1b023、0x286085f0、0xca417918、0xb8db38ef、0x8e79dcb0、0x603a180e、0x6c9e01e8bededede8b ed 0xd71577c1、0xbd314b27、0x78af2fda、0x55605c60、0xe65525f3、0xaa55ab94、0x57489862、0x63e81440、0x5555ca396a、0x2aab1ccb51pcb6、 0x1141e8ce、0xa15486af、0x7c72e993、0xb3ee1411、0x636fbc2a、0x2ba9c55d、0x741831f6、0xce5c3e16、0x9b87931e、0xafd6ba33、0xf5c24c24c24c24 0x7a325381、0x28958677、0x3b8f4898、0x6b4bbb9af、0xc4bfe81b、0x66282193、0x61d809cc、0xfb21a991、0x487cac60、0x5dec8555d555d555d555d555555455545554554555554545550 0xe98575b1、0xdc262302、0xeb651b88、0x23893e81、0xd396acc5、0xf6d6ff3、0x83ff44239、0x2e0b4482、0xa4842004、0x69c8f9b19bed 0x21c66842、0xf6e96c9a、0x670c9c61、0xabd388f0、0x6a51a0d2、0xd8542f68、0x960fa728、0xab5133a3、0x6eef0b6c、0x137a3be4、0x137a3be4 0x7EFB2A98、0XA1F1651D、0x39AF0176、0x66CA593E、0x82430E88、0x8cee8619、0x456fb4、0x7d84a5c3、0x3b85ebe、0xe06f75d8、0xe06f75d8、 0x401A449F、0x56C16AA6、0x4ED3AA62、0x363f7706、0x1bfedf72、0x429b023d、0x37d0d724、0xd00a1248、0xdb0fead3、0x49f1c09b、0x49f1c09b、0x49f1c09b、 0x80991b7b、0x25d479d8、0xf6e8def7、0xe3fe501a、0xb6794c3b、0x976ce0bd、0x4c006ba、0xc1a94fb6、0x409f60c4、0x5e5c96a2636a、0x196a 0x68fb6faf、0x3e6c53b5、0x1339b2eb、0x3b52ec6f、0x6dfc511f、0x9b30952c、0xcc814544、0xaf5ebd09、0xbee3d004、0xde334afd、0xf2807、 0x192e4bb3、0xc0cba857、0x45c8740f、0xd20b5f39、0xb9d3fbdb、0x5579c0bd、0x1a60320a、0xd6a100c6、0x402c7279、0x67999fcf25fefe、 0x8ea5e9f8、0xdb32228、0x3c7516df、0xfd616b15、0x2ff501ec8、0xad0552ab、0x323db5fa、0xfd238760、0x53317b48、0x3e0000df82、0xf82、0xf82、 0xca6f8ca0、0x1a87562e、0xdf1769db、0xd542a8f6、0x287effc3、0xac6732c6、0x8c4f5573、0x695b27b0、0xbca58c8、0xe1ffa01a0、 0x10fa3d98、0xfd2183b8、0x4afcb56c、0x2dd1d35b、0x9a53e479、0xd28e49bc、0x4bbfb9790、0xe1df2da、0xa4cb7e33 0x62fb1341、0xcee4c6e8、0xef20cada、0x36774c01、0xd07e9efe、0x2bf11fb4、0xae909198、0xeaad8e71、 0xafc725e0、0x8e3c5b2f、0x8e7594b7、0x8ff6e2fb、0xf2122b64、0x8888b812、0x900df01c、0x4fad5ea0、0x6888fc31c、0xd1cff191、0xff191、0xff191、0xff191 0x2ff2218、0xbe0e1777、0xea752dfe、0x8b021fa1、0xe5a0cc0f、0xb56f74e8、0x18acf3d6、0xce89e299、0xb4a84fe0、0xfd13e0b7、0x7cc43b81 0xd2ada8d9、0x165fa266、0x80957705、0x93cc7314、0x211a1477、0xe6ad2065、0x77b5fa86、0xc75442f5、0xfb9d35cf、0xebcdaf0cc、0xebcdaf0c、0xebcdaf0c、0xebcdaf0c、 0xd6411bd3、0xae1e7e49、0x250e2d、0x2071b35e、0x226800bb、0x57b8e0af、0x2464369b、0xf009b91e、0x5563911d、0x59dfa6aa、0x78c14389 0xd95a537f、0x207d5ba2、0x2e5b9c5、0x83260376、0x6295cfa9、0x11c81968、0x4e734a41、0xb3472dca、0x7b14a、0x1b5510052、0x7b510052、0x7b14a 0xd60f573f、0xbc9b6e4、0x2b60a476、0x81e67400、0x8ba6fb5、0x571be91f、0xf296ec6b、0x2a0dd915、0xbb6636521、0xe7b9f94052e、0xf94052e、 0xc5855664、0x53b02d5d、0xa99f8fa1、0x8ba4799、0x6e85076a}; Static final int sbox_init_2 [] = {0x4b7a70e9、0xb5b32944、0xdb75092、0xad6ea6b0、0x49a7df7d、0x9cee60b8 0x699a17ff、0x5664526c、0xc2b19ee1、0x193602a5、0x75094c29、0xa0591340、0xe4183a3e、0x3f54989a、0x5b429d65、0x6b8fd66、 0xa1d29c07、0xefe830f5、0x4d2d38e6、0xf0255dc1、0x4cdddd2086、0x8470eb26、0x6382e9c6、0x21ecc5e、0x968686b3f、0x3ebaefeefc9、0x3814 0x6b6a70a1、0x687f3584、0x52a0e286、0xb79c5305、0xaa500737、0x3e07841c、0x7fdeae5c、0x8e7d44ec、0x5716f2b8、0xb03ada37、0xf0500cdf0500cdf0500cdf0500cdf0500cdf0500cdf0500cdf0500cdf0500 0xf01c1f04、0x200b3ff、0xae0cf51a、0x3cb574b2、0x25837a58、0xdc0921bd、0xd19113f9、0x7ca92ff6、0x94324773、0x2ff54701、0x254701、0x254701、0x254701、0x254701 0x37C2DADC、0xc8b57634、0x9af3dda7、0xa9446146、0xfd0030e、0xecc8c73e、0xa4751e41、0xe238cd99、0x3bea0e2f、0x3280bba1、0x31831831831831831831831831831831 0x4e548b38、0x4f6db908、0x6f420d03、0xf60a04bf、0x2cb81290、0x24977c79、0x5679b072、0xbcaf89af、0xde9771f、0xd99381012、0xd9381012 0xdccf3f2e、0x5512721f、0x2e6b7124、0x501adde6、0x9f84cd87、0x7a584718、0x7408da17、0xbc9f9abc、0xe94b7d8c、0xec7aa 0x63094366、0xc464c3d2、0xef1c1847、0x3215d908、0xdd433b37、0x24c2ba16、0x12a14d43、0x2a65c451、0x50940002、0x133ae4dddddddddddddddddddddddddddddddd4002、 0x10314e55、0x81ac77d6、0x5f11199b、0x43556f1、0xd7a3c76b、0x3c11183b、0x5924a509、0xf28fe6ed、0x97f1fbffa、0x9ebabf2c、0x153c153c、0x97fc、 0x86e34570、0xeae96fb1、0x860e5e0a、0x5a3e2ab3、0x771fe71c、0x4e3d06fa、0x2965dcb9、0x99e71d0f、0x803e89d6、0x5268825、 0x9c10b36a、0xc6150eba、0x94e2ea78、0xa5fc3c53、0x1e0a2df4、0xf2f74ea7、0x361d2b3d、0x1939260f、0x19c27960、0x523a 0xebadfe6e、0xeac31f66、0xe3bc4595、0xa67bc883、0xb18cff28、0xc332def、0xbe6c5aa5、0x65582185、0x68ab9802、0 xxeeceeeceeeceeceeeceeceeceeceeceeceeceeceeceeceeceeceeceeceeceeceecee 0xdb2ff953b、0x2aef7dad、0x5b6e2f84、0x1521b628、0x29076170、0xecdd4775、0x619f1510、0x13cca830、0xeb61bd96、0x334fe1e、0xebfe1e、0xebfe1e、0x34fe1e、 0xb5735c90、0x4c70a239、0xd59e9e9e0b、0xcbaade14、0xeecc86bc、0x60622ca7、0x9cab5cab、0xb2ff3846e、0x648b1af、0x19bdf0236923692369 0x6555550、0x40685a32、0x3c2ab4b3、0x319ee9d5、0xc021b8f7、0x9b540b19、0x875fa099、0x95f7997e、0x623d7d7da8、0xf83788888888888 0x11ed935f、0x16681281、0xe358829、0xc7e61fd6、0x96dedfa1、0x7858ba99、0x57f584a5、0x1b227263、0x9b83c3ff、0x1ac24696、0x24696、0x24696、0x24696、0x24696、0x24696、0x24696、0x24696、0X24696 0x532e3054、0x8fd948e4、0x6dbc3128、0x58ebf2ef、0x34c6ffea、0xfe28ed61、0xee7c3c73、0x5d4a14d9、0xe864b7e3、0x42105d14、0x42105d14、0x42105d14、0x42105d14、0x4205d14、0x4205d14、0x4205d14、0x42105d14、0x42105d14、0x4205d14、0x45d14、0x45d14、0x45d14、0x45d14、0x45d14、0x45d14、0x45d14r 0x45ee2b6、0xa3aaabea、0xdb6c4f15、0xfacb4fd0、0xc742ff442、0xef6abbb5、0x654ff3b1d、0x41cd2105、0xd81e799999999999999 0x3d816250、0xcf62a1f2、0x5b8d2646、0xfc8883a0、0xc1c7b6a3、0x7f1524c3、0x69cb7492、0x47848a0b、0x5692b285、0x9595955bbbbbbfp00、 0x1462b174、0x23820e00、0x58428d2a、0xc55f5ea、0x1dadf43e、0x233f7061、0x3372ff092、0x8d937e41、0xd65fecf1、0x6c223bdbedb、0x223bdbedb、 0xcbee7460、0x4085f2a7、0xce77326e、0xa6078084、0x19f8509e、0xe8efd855、0x61d99735、0xa969a7aa、0xc506c2、0x5a04abcadcadcadcadcadcadcadcadcdc、 0x9e447a2e、0xc3453484、0xfdd56705、0xe1e9ec9、0xdb73dbd3、0x105588cd、0x675fda79、0xe3674340、0xc5c5c43465、0x7133898d8、 0xf16dff20、0x153e21e7、0x8fb03d4a、0xe6e39f2b、0xdb83adf7}; Static final int sbox_init_3 [] = {0xe93d5a68、0x948140f7、0xf64c261c、0x94692934、0x411520f7、0x7602d4f7、0xbcf46b2e、0xd4a20068、0xxd408271、 0x3320F46a、0x43b7d4b7、0x500061af、0x1e39f62e、0x972444546、0x14214f74、0xbf8b8840、0x4d95fc1d、0x96b591af、0x70f452525252591af、 0xbfbc09ec、0x3bd9785、0x7fac6dd0、0x31cb8504、0x96eb27b3、0x55fd3941、0xda2547e6、0xabca0a9a、0x28507825 0xe9b66dfb、0x68dc1462、0xd7486900、0x680ec0a4、0x27a18dee、0x4f3ffea2、0xe887ad8c、0xb58ce006、0x7af4d6b6、 0xce78a399、0x406b2a42、0x20fe9e35、0xd9f385b9、0xee39d7ab、0x3b124e8b、0x1dc9faf7、0x4b6d1856、0x26a36631、0xee397b2、0xee397b2、0xee397b2、0xee397b2、0xee397b2、0xee397b 0xdd5b4332、0x6841e7f7、0xca7820fb、0xfb0af54e、0xd8feb397、0x454056ac、0xba489527、0x55533a3a、0x20838d87、0xfe6ba9b7、0xxd0954b、 0x55a867bc、0xa1159a58、0xcca92963、0x99e1db33、0xa62a4a56、0x3f3125f9、0x5ef47e1c、0x9029317c、0xf8e8e802、0x4272f70、0x4272f70、 0x5282ce3、0x95c11548、0xe4c66d22、0x48c1133f、0xc70f86dc、0x7f9c9ee、0x41041f0f、0x404779a4、0x5d886e17、0x325f51599fbcd59fcd59fcd59999999 0xf2bcc18f、0x41113564、0x257b7834、0x602a9c60、0xdff8e8a3、0x1f636c1b、0xe12b4c2、0x2e1329e、0xaf664fd1、0xcad18115、0xad18115、0xad18115、0xad18115、0xad18115、0xad18115、 0x3333e92e1、0x3b240b62、0xeebeb922、0x85b2a20e、0xe6ba0d99、0xde720c8c、0x2da2ff728、0xd0127845、0x95b794fd、0x647d05fp55f5555555555555555b794fd 0x5449a36f、0x877d48fa、0xc39dfd27、0xf33e8d1e、0xa476341、0x992eff74、0x3a6f6eb6eab、0xf4f8fd37、0xa812dc60、0xa1cebdf8、0xa1ebdf8、 0xdb6e6b0d、0xc67b5510、0x6d672c37、0x2765d43b、0xdcd0e804、0xf1290dc7、0xcc00ffa3、0xb5390f92、0x690fed0b、0x666b9ffbb、0x69ffb7d9c、0x690fed0b、 0xa091cf0b、0xd9155ea3、0xbb132f88、0x515bad24、0x7b9479bf、0x763bd6eb、0x37392eb3、0xcc115979、0x8026e297、0xf42e31112d、0xf42e312d、 0xc66a2b3b、0x12754ccc、0x782ef11c、0x6a124237、0xb79251e7、0x6a1bbe6、0x4bfb6350、0x1a6b1018、0x11caedfa、0x3d25bbbbbdd8、0xd8、0xe2e1ce2c3c9 0x44421659、0xa121386、0xd90cec6e、0xd5abea2a、0x64af674e、0xda86a85f、0xbebfe988、0x64e4c3fe、0x9dbbc8057、0xf0f7c086、0X086、0x086、0x086、0x086、0xf7c086、0xf7c086、0x0f7c086、0X0886、0xf7c086、0x0886、0xf7c086、0xf7c086、0xf7c086、0X086、0x086、0X0886、0 0x6003604d、0xd1fd8346、0xf6381fb0、0x7745ae04、0xd736fccc、0x83426b33、01eab71、0xb0804187、0x3c005e5f、0x7a057be、0x7a057be、0x7a057be、 0x55464299、0xbf582e61、0x4e58f48f、0xf2ddfda2、0x8789bdc2、0x5366f9c3、0xc8b38e74、 0x7Aeb2661、0x8b1ddf84、0x846a0e79、0x915f95e2、0x466e598e、0x20b45770、0x8cd55591、0xc902de4c、0xb90bace1、0xb8205d0、0xb8205d0、0xb8205d0、 0x7574a99e、0xb77f19b6、0xe0a9dc09、0x662d09a1、0xc4324633、0xe85a1f02、0x9f0be8c、0x4ay999a025、0x1d6efe10、0x1ab93d1ddd、0x1ab93d11dddddddd6efe10、 0xa186f20f、0x2868f169、0xdcb7da83、0x573906fe、0xa1e2ce9b、0x4fcd7f52、0x50115e01、0xa70683fa、0xa0025c4、0xde6d027、0xde6d027、0xde6d027、0xe 0x773f8641、0xc3604c06、0x61a806b5、0xf0177a28、0xc0f586e0、0x6058aa、0x30dc7d62、0x11e69ed7、0x2338e63、0x53c2ddd94、0x2ddd94、0x2ddd94、0x2ddd94、0x2ddd94 0xbbcbee56、0x90bcb6de、0xebfc7da1、0xce591d76、0x6f05e409、0x4bb7c0188、0x39720a3d、0x7c927c24、0x86e3725f、0x724d925f、0x724d925f 0xd39eb8fc、0xed545578、0x8fca5b5、0xd83d7cd3、0x4dad0fc4、0x1e50ef5e、0xb161e6f8、0xa28514d9、0x6c51133c、0x6fd5c7e7、0x7e7、 0x362abfce、0xddc6c837、0xd79a3234、0x92638212、0x670efa8e、0x406000e0}; Static final int sbox_init_4 [] = {0x3a39ce37、0xd3faf5cf、0xabc27737、0x5ac52d1b、0x5cb0679e、0x4fa33742、0xd3822740、0x99bc9bbe 0xbf0f7315、0xd62d1c7e、0xc700c47b、0xb78c1b6b、0x21a19045、0xb26eb1be、0x6a366eb4、0x5748ab2f、0xbc946e79、0xc6a376d2、 0x530ff8ee、0x468de7d、0xd5730a1d、0x4cd04dc6、0x2939bbdb、0xa9ba4650、0xac9526e8、0xbe5ee304、0xa1fad5f0、0x6a2d519a、0x6328ce2 0xc089c2b8、0x43242ef6、0xa51e03aa、0x9cf2d0a4、0x83c061ba、0x9be96a4d、0x8fe51550、0xba645bd6、0x2826a2fffffffffffffffffffffffffffffffff 0xef5562e9、0xc72fefd3、0xf752f7da、0x3f046f69、0x77fa0a59、0x80e4a915、0x87b08601、0x9b09e6ad、0x3ee593、0xe990fd7e、0xe90fd57e、 0x2cf0b7d9、0x22b8b51、0x96d5ac3a、0x17da67d、0xd1cf3ed6、0x7c7d2d28、0x1fd28、0x1fd29f25cf、0xadf2b89b、0x5ad6472、0x5a888f54c、0x5a88f54c、 0xe019a5e6、0x47b0acfd、0xed93fa9b、0xe8d3c48d、0x283b57cc、0xf8d56629、0x79132e28、0x785f0191、0xed756055、0xf7960ce44、0xf7960ce44、 0x15056dd4、0x88f46dba、0x3a16125、0x564f0bd、0xc3eb9e15、0x3c9057a2、0x97271aec、0xa93a072a、0x1b3f6d9b、0x1e6321f5、0xf5921f5、 0x26dcf319、0x753d928、0xb155fdf5、0x3563482、0x8aba3cbb、0x28517711、0xc20ad9f8、0xabcc5167、0xccad925f、0x4de81751、0xcad938phe、 0x379d5862、0x9320f991、0xea7a90c2、0xfb3e7bce、0x5121ce64、0x774fbe32、0xa8b6e37e、0xc3293d46、0x48de5369、0x6413e680、0x413e680、0x413e680、 0xdd6db224、0x69852dfd、0x9072166、0xb39a460a、0x64445c0dd、0x1c20c8ae、0x5bbef7dd、0x1b58d40、0xccd2017f、0xd2017f、0xd2017f、0xd2017f、0xd2017f、 0xdda26a7e、0x3a59ff45、0x3e350a44、0xbcb4cdd5、0x72eacea8、0xfa6484bb、0x8d6612ae、0xbf3c6f47、0xd29be463、0x542ff5d91bb71bb71b71b7163 0xf64e6370、0x740e0d8d、0xe75b1357、0xf8721671、0xaf537d5d、0x4040cb08、0x4eb4e2cc、0x34d2466a、0x115af84、0xe1b00428、0x10428、0x11584、 0x6b89fb4、0xce6ea048、0x6f3f3b82、0x3520ab82、0x11a1d4b、0x277227f8、0x611560b1、0xe7933fdc、0xbbb3a792b、0x3444444444444d、0xa0888392 0x51ce794b、0x2f32c9b7、0xa01fbac9、0xe01cc87e、0xcf0111c3、0xa1e8aac7、0x1a908749、0xd4444444444444444444444444444444444444444444444444444444444444444444444444444 0x339c32a、0xc6913667、0x8df9317c、0xe0b12b4f、0xf79e59b7、0x43f5bb3a、0xf2d519ff、0x27d9459c、0xbf97222c、0x15e61fc2a、 0x9b941525、0xfae59361、0xceb69ceb、0xc2a86459、0x12baa8d1、0xb6c1075e、0xe3056a0c、0x10d25065、0xcb03a4442、0xe0ec6e0e、0xcb0e、0xcb0e、0xec6e0e、0xcb03bb 0x4c98a0be、0x3278e964、0x9f1f9532、0xe0d392df、0xd3a0342b、0x8971f21e、0x1b0a7441、0x4ba33348c、0xccccc37120、0xc3773282d8、 0x9b992f2e、0xe60b6f47、0xfe3f11d、0xe54cda54、0x1edadad891、0xce6279cf、0xcd3e7e6f、0x1618b166、0xfd2c1d05、0x88fd29、0xfd2c5、0x88fd29、0xfd29、0xfd29、0xfd29、0xfd29、 0xf523f357、0xa6327623、0x93a83531、0x56cccd02、0xacf08162、0x5a75ebb5、0x6e163697、0x88d273cc、0xde966292、0x81b9492d0、 0x71c65614、0xe6c6c7bd、0x327a140a、0x45e1d006、0xc3f27b9a、0xc9aa53fd、0x62a80f00、0xbb25bfe2、0x35bddd2f6、0x71126905、0x71126905、 0xb6cbcf7c、0xcd769c2b、0x53113ec0、0x1640e3d3、0x38abbd60、0x2547adf0、0xba38209c、0xf746ce76、0x777afa1c5、0x20756060、0x2 0x8ae88dd8、0x7aaaf9b0、0x4cf9aa7e、0x1948c25c、0x2fb8a8c、0x1c36ae4、0xd6ebe1f9、0x90d4f869、0xa65cdea0、0x3f09252d、0x3f09252d、0x3f09252d、0x3f09252d 0xb74e6132、0xce77e25b、0x578fdfe3、0x3ac372e6}; public blowfishecb(byte bfkey []){m_pbox = new int [18]; for(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]; for(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; for(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; } long lzero = 0l; for(int ni = 0; ni <18; ni += 2){lzero = encryptblock(lzero); m_pbox [ni] =(int)(lzero >>> 32); m_pbox [ni + 1] =(int)(lzero&0xffffffffl); } for(int ni = 0; ni <256; ni += 2){lzero = encryptblock(lzero); m_sbox1 [ni] =(int)(lzero >>> 32); m_sbox1 [ni + 1] =(int)(lzero&0xfffffffffl); } for(int ni = 0; ni <256; ni += 2){lzero = encryptblock(lzero); m_sbox2 [ni] =(int)(lzero >>> 32); m_sbox2 [ni + 1] =(int)(lzero&0xfffffffffl); } for(int ni = 0; ni <256; ni += 2){lzero = encryptblock(lzero); m_sbox3 [ni] =(int)(lzero >>> 32); m_sbox3 [ni + 1] =(int)(lzero&0xffffffffffl); } for(int ni = 0; ni <256; ni += 2){lzero = encryptblock(lzero); m_sbox4 [ni] =(int)(lzero >>> 32); m_sbox4 [ni + 1] =(int)(lzero&0xffffffffl); }}} public blowfish(string password){Messaged Gigest Digest = null; try {digest = mesagedigest.getInstance( "sha1"); Digest.update(password.getBytes()); } catch(例外e){log.error(e.getmessage()、e); } m_bfish = new blowfishcbc(digest.digest()、0l); Digest.reset(); } public string encryptString(string splantext){long lcbciv;同期(m_rndgen){lcbciv = m_rndgen.nextlong(); } return encstr(splantext、lcbciv); } private string encstr(string splantext、long lnewcbciv){int nstrlen = splaintext.length(); byte buf [] = new byte [(nstrlen << 1&-8) + 8]; int npos = 0; for(int ni = 0; ni <nstrlen; ni ++){char cactchar = splantext.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 [] = new Byte [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 [] = 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 ""; } else {return bytearraytouncstring(buf、0、nnumofbytes); }} public void Destroy(){m_bfish.cleanup(); } private static long bytearraytolong(byte buffer []、int nstartindex){return(long)buffer [nstartindex] << 56 | (バッファー[nstartindex + 1]&255l)<< 48 | (バッファー[nstartindex + 2]&255l)<< 40 | (バッファー[nstartindex + 3]&255l)<< 32 | (バッファー[nstartindex + 4]&255l)<< 24 | (バッファー[nstartindex + 5]&255l)<< 16 | (バッファー[nstartindex + 3]&255l)<< 32 | (バッファー[nstartindex + 4]&255l)<< 24 | (バッファー[nstartindex + 5]&255l)<< 16 | (バッファー[nstartindex + 6]&255l)<< 8 |バッファー[nstartindex + 7]&255l; } private static void longtobytearray(long lvalue、byte buffer []、int nstartindex){buffer [nstartindex] =(byte)(int)(lvalue >>> 56);バッファー[nstartindex + 1] =(byte)(int)(lvalue >>> 48&255l);バッファー[nstartindex + 2] =(byte)(int)(lvalue >>> 40&255l);バッファー[nstartindex + 3] =(byte)(int)(lvalue >>> 32&255l);バッファー[nstartindex + 4] =(byte)(int)(lvalue >>> 24&255l);バッファー[nstartindex + 5] =(byte)(int)(lvalue >>> 16&255l);バッファー[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&0xfffffffffl; } private static int longlo32(long lval){return(int)lval; } private static int longhi32(long lval){return(int)(lval >>> 32); } private static string bytestobinhex(byte data []、int nstartpos、int nnumofbytes){stringbuffer sbuf = new StringBuffer(); sbuf.setlength(nnumofbytes << 1); int npos = 0; for(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、byte data []、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; for(int ni = 0; ni <nnumofbytes; ni ++){byte bactbyte = 0; boolean blconvertok = true; for(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); } 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(byte data []、int nstartpos、int nnumofbytes){nnumofbytes&= -2; int navailcapacity = data.length -nstartpos; if(navailcapacity <nnumofbytes){nnumofbytes = navailcapacity; } stringbuffer sbuf = new StringBuffer(); sbuf.setlength(nnumofbytes >> 1); int nsbufpos = 0; for(; 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 = new Random();静的最終char hextab [] = {'0'、 '1'、 '2'、 '3'、 '4'、 '5' 6 '、' 7 '、' 8 '、' 9 '、' '、' b '、' c '、' d '、' e '、' f '};};}要約します
上記は、Java言語でBlowfish暗号化アルゴリズムの完全なコードを実装することに関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。