⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blowfish.java

📁 基于Jabber协议的即时消息服务器
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
            {                return false;            }            BlowfishECB testbf2 = new BlowfishECB(testKey2);            testbf2.encrypt(tv_p2, tv_t2);            if ((tv_t2[0] != tv_c2[0]) ||                    (tv_t2[1] != tv_c2[1]))            {                return false;            }            testbf2.decrypt(tv_t2);            if ((tv_t2[0] != tv_p2[0]) ||                    (tv_t2[1] != tv_p2[1]))            {                return false;            }            // all tests passed            return true;        }        // internal routine to encrypt a 64bit block        protected long encryptBlock(long lPlainBlock)        {            // split the block in two 32 bit halves            int nHi = longHi32(lPlainBlock);            int nLo = longLo32(lPlainBlock);            // encrypt the block, gain more speed by unrooling the loop            // (we avoid swapping by using nHi and nLo alternating at            // odd an even loop nubers) and using local references            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) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[1];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[2];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[3];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[4];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[5];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[6];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[7];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[8];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[9];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[10];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[11];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[12];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[13];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[14];            nLo ^= (((sbox1[nHi >>> 24] + sbox2[(nHi >>> 16) & 0x0ff]) ^ sbox3[(nHi >>> 8) & 0x0ff]) + sbox4[nHi & 0x0ff]) ^ pbox[15];            nHi ^= (((sbox1[nLo >>> 24] + sbox2[(nLo >>> 16) & 0x0ff]) ^ sbox3[(nLo >>> 8) & 0x0ff]) + sbox4[nLo & 0x0ff]) ^ pbox[16];            // finalize, cross and return the reassembled block            return makeLong(nHi, nLo ^ pbox[17]);        }        // internal routine to decrypt a 64bit block        protected long decryptBlock(long lCipherBlock) {            // (same as above)            int nHi = longHi32(lCipherBlock);            int nLo = longLo32(lCipherBlock);            nHi ^= m_pbox[17];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[16];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[15];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[14];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[13];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[12];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[11];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[10];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[9];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[8];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[7];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[6];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[5];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[4];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[3];            nLo ^= (((m_sbox1[nHi >>> 24] + m_sbox2[(nHi >>> 16) & 0x0ff]) ^ m_sbox3[(nHi >>> 8) & 0x0ff]) + m_sbox4[nHi & 0x0ff]) ^ m_pbox[2];            nHi ^= (((m_sbox1[nLo >>> 24] + m_sbox2[(nLo >>> 16) & 0x0ff]) ^ m_sbox3[(nLo >>> 8) & 0x0ff]) + m_sbox4[nLo & 0x0ff]) ^ m_pbox[1];            return makeLong(nHi, nLo ^ m_pbox[0]);        }        /**         * Encrypts a byte buffer (should be aligned to an 8 byte border) to another         * buffer (of the same size or bigger)         *         * @param inbuffer buffer with plaintext data         * @param outbuffer buffer to get the ciphertext data         */        public void encrypt(byte[] inbuffer, byte[] outbuffer) {            int nLen = inbuffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=8)            {                // encrypt a temporary 64bit block                lTemp = byteArrayToLong(inbuffer, nI);                lTemp = encryptBlock(lTemp);                longToByteArray(lTemp, outbuffer, nI);            }        }        /**         * encrypts a byte buffer (should be aligned to an 8 byte border) to itself         * @param buffer buffer to encrypt         */        public void encrypt(byte[] buffer)        {            int nLen = buffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=8)            {                // encrypt a temporary 64bit block                lTemp = byteArrayToLong(buffer, nI);                lTemp = encryptBlock(lTemp);                longToByteArray(lTemp, buffer, nI);            }        }        /**         * encrypts an integer buffer (should be aligned to an         * two integer border) to another int buffer (of the         * same size or bigger)         * @param inbuffer buffer with plaintext data         * @param outbuffer buffer to get the ciphertext data         */        public void encrypt(int[] inbuffer, int[] outbuffer) {            int nLen = inbuffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=2)            {                // encrypt a temporary 64bit block                lTemp = intArrayToLong(inbuffer, nI);                lTemp = encryptBlock(lTemp);                longToIntArray(lTemp, outbuffer, nI);            }        }        /**         * encrypts an int buffer (should be aligned to a         * two integer border)         * @param buffer buffer to encrypt         */        public void encrypt(int[] buffer) {            int nLen = buffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=2)            {                // encrypt a temporary 64bit block                lTemp = intArrayToLong(buffer, nI);                lTemp = encryptBlock(lTemp);                longToIntArray(lTemp, buffer, nI);            }        }        /**         * encrypts a long buffer to another long buffer (of the same size or bigger)         * @param inbuffer buffer with plaintext data         * @param outbuffer buffer to get the ciphertext data         */        public void encrypt(long[] inbuffer, long[] outbuffer) {            int nLen = inbuffer.length;            for (int nI = 0; nI < nLen; nI++)            {                outbuffer[nI] = encryptBlock(inbuffer[nI]);            }        }        /**         * encrypts a long buffer to itself         * @param buffer buffer to encrypt         */        public void encrypt(long[] buffer) {            int nLen = buffer.length;            for (int nI = 0; nI < nLen; nI++)            {                buffer[nI] = encryptBlock(buffer[nI]);            }        }        /**         * decrypts a byte buffer (should be aligned to an 8 byte border)         * to another byte buffer (of the same size or bigger)         * @param inbuffer buffer with ciphertext data         * @param outbuffer buffer to get the plaintext data         */        public void decrypt(byte[] inbuffer,                            byte[] outbuffer)        {            int nLen = inbuffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=8)            {                // decrypt a temporary 64bit block                lTemp = byteArrayToLong(inbuffer, nI);                lTemp = decryptBlock(lTemp);                longToByteArray(lTemp, outbuffer, nI);            }        }        /**         * decrypts a byte buffer (should be aligned to an 8 byte border) to itself         * @param buffer buffer to decrypt         */        public void decrypt(byte[] buffer)        {            int nLen = buffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=8)            {                // decrypt over a temporary 64bit block                lTemp = byteArrayToLong(buffer, nI);                lTemp = decryptBlock(lTemp);                longToByteArray(lTemp, buffer, nI);            }        }        /**         * decrypts an integer buffer (should be aligned to an         * two integer border) to another int buffer (of the same size or bigger)         * @param inbuffer buffer with ciphertext data         * @param outbuffer buffer to get the plaintext data         */        public void decrypt(int[] inbuffer,                            int[] outbuffer)        {            int nLen = inbuffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=2)            {                // decrypt a temporary 64bit block                lTemp = intArrayToLong(inbuffer, nI);                lTemp = decryptBlock(lTemp);                longToIntArray(lTemp, outbuffer, nI);            }        }        /**         * decrypts an int buffer (should be aligned to an         * two integer border)         * @param buffer buffer to decrypt         */        public void decrypt(int[] buffer)        {            int nLen = buffer.length;            long lTemp;            for (int nI = 0; nI < nLen; nI +=2)            {                // decrypt a temporary 64bit block                lTemp = intArrayToLong(buffer, nI);                lTemp = decryptBlock(lTemp);                longToIntArray(lTemp, buffer, nI);            }        }        /**         * decrypts a long buffer to another long buffer (of the same size or bigger)         * @param inbuffer buffer with ciphertext data         * @param outbuffer buffer to get the plaintext data         */        public void decrypt(long[] inbuffer,                            long[] outbuffer)        {            int nLen = inbuffer.length;            for (int nI = 0; nI < nLen; nI++)            {                outbuffer[nI] = decryptBlock(inbuffer[nI]);            }        }        /**         * decrypts a long buffer to itself         * @param buffer buffer to decrypt         */        public void decrypt(long[] buffer) {            int nLen = buffer.length;            for (int nI = 0; nI < nLen; nI++)            {                buffer[nI] = decryptBlock(buffer[nI]);            }        }        // the boxes init. data,        // FIXME: it might be better to create them at runtime to make the class        //        file smaller, e.g. by calculating the hexdigits of pi (default)        //        or just a fixed random sequence (out of the standard)        final static int pbox_init[] = {            0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,            0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,            0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b  };        final static int sbox_init_1[] = {            0xd1310ba6,   0x98dfb5ac,   0x2ffd72db,   0xd01adfb7,   0xb8e1afed,   0x6a267e96,            0xba7c9045,   0xf12c7f99,   0x24a19947,   0xb3916cf7,   0x0801f2e2,   0x858efc16,            0x636920d8,   0x71574e69,   0xa458fea3,   0xf4933d7e,   0x0d95748f,   0x728eb658,            0x718bcd58,   0x82154aee,   0x7b54a41d,   0xc25a59b5,   0x9c30d539,   0x2af26013,            0xc5d1b023,   0x286085f0,   0xca417918,   0xb8db38ef,   0x8e79dcb0,   0x603a180e,            0x6c9e0e8b,   0xb01e8a3e,   0xd71577c1,   0xbd314b27,   0x78af2fda,   0x55605c60,            0xe65525f3,   0xaa55ab94,   0x57489862,   0x63e81440,   0x55ca396a,   0x2aab10b6,            0xb4cc5c34,   0x1141e8ce,   0xa15486af,   0x7c72e993,   0xb3ee1411,   0x636fbc2a,            0x2ba9c55d,   0x741831f6,   0xce5c3e16,   0x9b87931e,   0xafd6ba33,   0x6c24cf5c,            0x7a325381,   0x28958677,   0x3b8f4898,   0x6b4bb9af,   0xc4bfe81b,   0x66282193,            0x61d809cc,   0xfb21a991,   0x487cac60,   0x5dec8032,   0xef845d5d,   0xe98575b1,            0xdc262302,   0xeb651b88,   0x23893e81,   0xd396acc5,   0x0f6d6ff3,   0x83f44239,            0x2e0b4482,   0xa4842004,   0x69c8f04a,   0x9e1f9b5e,   0x21c66842,   0xf6e96c9a,            0x670c9c61,   0xabd388f0,   0x6a51a0d2,   0xd8542f68,   0x960fa728,   0xab5133a3,            0x6eef0b6c,   0x137a3be4,   0xba3bf050,   0x7efb2a98,   0xa1f1651d,   0x39af0176,            0x66ca593e,   0x82430e88,   0x8cee8619,   0x456f9fb4,   0x7d84a5c3,   0x3b8b5ebe,            0xe06f75d8,   0x85c12073,   0x401a449f,   0x56c16aa6,   0x4ed3aa62,   0x363f7706,            0x1bfedf72,   0x429b023d,   0x37d0d724,   0xd00a1248,   0xdb0fead3,   0x49f1c09b,            0x075372c9,   0x80991b7b,   0x25d479d8,   0xf6e8def7,   0xe3fe501a,   0xb6794c3b,            0x976ce0bd,   0x04c006ba,   0xc1a94fb6,   0x409f60c4,   0x5e5c9ec2,   0x196a2463,            0x68fb6faf,   0x3e6c53b5,   0x1339b2eb,   0x3b52ec6f,   0x6dfc511f,   0x9b30952c,            0xcc814544,   0xaf5ebd09,   0xbee3d004,   0xde334afd,   0x660f2807,   0x192e4bb3,            0xc0cba857,   0x45c8740f,   0xd20b5f39,   0xb9d3fbdb,   0x5579c0bd,   0x1a60320a,            0xd6a100c6,   0x402c7279,   0x679f25fe,   0xfb1fa3cc,   0x8ea5e9f8,   0xdb3222f8,            0x3c7516df,   0xfd616b15,   0x2f501ec8,   0xad0552ab,   0x323db5fa,   0xfd238760,            0x53317b48,   0x3e00df82,   0x9e5c57bb,   0xca6f8ca0,   0x1a87562e,   0xdf1769db,            0xd542a8f6,   0x287effc3,   0xac6732c6,   0x8c4f5573,   0x695b27b0,   0xbbca58c8,            0xe1ffa35d,   0xb8f011a0,   0x10fa3d98,   0xfd2183b8,   0x4afcb56c,   0x2dd1d35b,            0x9a53e479,   0xb6f84565,   0xd28e49bc,   0x4bfb9790,   0xe1ddf2da,   0xa4cb7e33,            0x62fb1341,   0xcee4c6e8,   0xef20cada,   0x36774c01,   0xd07e9efe,   0x2bf11fb4,            0x95dbda4d,   0xae909198,   0xeaad8e71,   0x6b93d5a0,   0xd08ed1d0,   0xafc725e0,            0x8e3c5b2f,   0x8e7594b7,   0x8ff6e2fb,   0xf2122b64,   0x8888b812,   0x900df01c,            0x4fad5ea0,   0x688fc31c,   0xd1cff191,   0xb3a8c1ad,   0x2f2f2218,   0xbe0e1777,            0xea752dfe,   0x8b021fa1,   0xe5a0cc0f,   0xb56f74e8,   0x18acf3d6,   0xce89e299,            0xb4a84fe0,   0xfd13e0b7,   0x7cc43b81,   0xd2ada8d9,   0x165fa266,   0x80957705,            0x93cc7314,   0x211a1477,   0xe6ad2065,   0x77b5fa86,   0xc75442f5,   0xfb9d35cf,            0xebcdaf0c,   0x7b3e89a0,   0xd6411bd3,   0xae1e7e49,   0x00250e2d,   0x2071b35e,            0x226800bb,   0x57b8e0af,   0x2464369b,   0xf009b91e,   0x5563911d,   0x59dfa6aa,            0x78c14389,   0xd95a537f,   0x207d5ba2,   0x02e5b9c5,   0x83260376,   0x6295cfa9,            0x11c81968,   0x4e734a41,   0xb3472dca,   0x7b14a94a,   0x1b510052,   0x9a532915,            0xd60f573f,   0xbc9bc6e4,   0x2b60a476,   0x81e67400,   0x08ba6fb5,   0x571be91f,            0xf296ec6b,   0x2a0dd915,   0xb6636521,   0xe7b9f9b6,   0xff34052e,   0xc5855664,            0x53b02d5d,   0xa99f8fa1,   0x08ba4799,   0x6e85076a };        final static int sbox_init_2[] = {            0x4b7a70e9,   0xb5b32944,            0xdb75092e,   0xc4192623,   0xad6ea6b0,   0x49a7df7d,   0x9cee60b8,   0x8fedb266,            0xecaa8c71,   0x699a17ff,   0x5664526c,   0xc2b19ee1,   0x193602a5,   0x75094c29,            0xa0591340,   0xe4183a3e,   0x3f54989a,   0x5b429d65,   0x6b8fe4d6,   0x99f73fd6,            0xa1d29c07,   0xefe830f5,   0x4d2d38e6,   0xf0255dc1,   0x4cdd2086,   0x8470eb26,            0x6382e9c6,   0x021ecc5e,   0x09686b3f,   0x3ebaefc9,   0x3c971814,   0x6b6a70a1,            0x687f3584,   0x52a0e286,   0xb79c5305,   0xaa500737,   0x3e07841c,   0x7fdeae5c,            0x8e7d44ec,   0x5716f2b8,   0xb03ada37,   0xf0500c0d,   0xf01c1f04,   0x0200b3ff,            0xae0cf51a,   0x3cb574b2,   0x25837a58,   0xdc0921bd,   0xd19113f9,   0x7ca92ff6,            0x94324773,   0x22f54701,   0x3ae5e581,   0x37c2dadc,   0xc8b57634,   0x9af3dda7,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -