📄 des.java
字号:
d = (d & 0x000000FF) << 16 | (d & 0x0000FF00) | (d & 0x00FF0000) >>> 16 | (c & 0xF0000000) >>> 4; c &= 0x0FFFFFFF; int s; int j = 0; for (i = 0; i < ROUNDS; i++) { if ((0x7EFC >> i & 1) == 1) { c = (c >>> 2 | c << 26) & 0x0FFFFFFF; d = (d >>> 2 | d << 26) & 0x0FFFFFFF; } else { c = (c >>> 1 | c << 27) & 0x0FFFFFFF; d = (d >>> 1 | d << 27) & 0x0FFFFFFF; } s = SKB[ c & 0x3F ] | SKB[0x040 | (((c >>> 6) & 0x03) | ((c >>> 7) & 0x3C))] | SKB[0x080 | (((c >>> 13) & 0x0F) | ((c >>> 14) & 0x30))] | SKB[0x0C0 | (((c >>> 20) & 0x01) | ((c >>> 21) & 0x06) | ((c >>> 22) & 0x38))]; t = SKB[0x100 | ( d & 0x3F )] | SKB[0x140 | (((d >>> 7) & 0x03) | ((d >>> 8) & 0x3c))] | SKB[0x180 | ((d >>> 15) & 0x3F )] | SKB[0x1C0 | (((d >>> 21) & 0x0F) | ((d >>> 22) & 0x30))]; sKey[j++] = t << 16 | (s & 0x0000FFFF); s = s >>> 16 | (t & 0xFFFF0000); sKey[j++] = s << 4 | s >>> 28; } } /** * Encrypts/decrypts a block, of length BLOCK_SIZE. * * @param in an array containing the input block * @param inOffset the starting offset of the input block * @param out an array containing the output block * @param inOffset the starting offset of the output block * @param encrypt true to encrypt, false to decrypt */ protected void des (byte[] in, int inOffset, byte[] out, int outOffset, boolean encrypt) { int[] lr = { (in[inOffset++] & 0xFF) | (in[inOffset++] & 0xFF) << 8 | (in[inOffset++] & 0xFF) << 16 | (in[inOffset++] & 0xFF) << 24, (in[inOffset++] & 0xFF) | (in[inOffset++] & 0xFF) << 8 | (in[inOffset++] & 0xFF) << 16 | (in[inOffset ] & 0xFF) << 24}; initialPermutation(lr); // do it! if (encrypt) encrypt_base(lr); else decrypt_base(lr); finalPermutation(lr); int R = lr[0]; int L = lr[1]; out[outOffset++] = (byte) L; out[outOffset++] = (byte)(L >> 8); out[outOffset++] = (byte)(L >> 16); out[outOffset++] = (byte)(L >> 24); out[outOffset++] = (byte) R; out[outOffset++] = (byte)(R >> 8); out[outOffset++] = (byte)(R >> 16); out[outOffset ] = (byte)(R >> 24); } /** Implements DES encryption without IP and FP. */ private void encrypt_base (int[] io) { int L = io[0]; int R = io[1]; // look! we fit all four variables (plus the class itself) // into short byte-codes! int u = R << 1 | R >>> 31; R = L << 1 | L >>> 31; L = u; int t; for (int i = 0; i < INTERNAL_KEY_LENGTH;) { u = R ^ sKey[i++]; t = R ^ sKey[i++]; t = t >>> 4 | t << 28; L ^= (SP_TRANS[0x040 | (t & 0x3F)] | SP_TRANS[0x0C0 | ((t >>> 8) & 0x3F)] | SP_TRANS[0x140 | ((t >>> 16) & 0x3F)] | SP_TRANS[0x1C0 | ((t >>> 24) & 0x3F)] | SP_TRANS[ u & 0x3F ] | SP_TRANS[0x080 | ((u >>> 8) & 0x3F)] | SP_TRANS[0x100 | ((u >>> 16) & 0x3F)] | SP_TRANS[0x180 | ((u >>> 24) & 0x3F)]); u = L ^ sKey[i++]; t = L ^ sKey[i++]; t = t >>> 4 | t << 28; R ^= (SP_TRANS[0x040 | (t & 0x3F)] | SP_TRANS[0x0C0 | ((t >>> 8) & 0x3F)] | SP_TRANS[0x140 | ((t >>> 16) & 0x3F)] | SP_TRANS[0x1C0 | ((t >>> 24) & 0x3F)] | SP_TRANS[ u & 0x3F ] | SP_TRANS[0x080 | ((u >>> 8) & 0x3F)] | SP_TRANS[0x100 | ((u >>> 16) & 0x3F)] | SP_TRANS[0x180 | ((u >>> 24) & 0x3F)]); } io[0] = R >>> 1 | R << 31; io[1] = L >>> 1 | L << 31; } /** Implements DES decryption without IP and FP. */ private void decrypt_base (int[] io) { int L = io[0]; int R = io[1]; // look! we fit all four variables (plus the class itself) // into short byte-codes! int u = R << 1 | R >>> 31; R = L << 1 | L >>> 31; L = u; int t; for (int i = INTERNAL_KEY_LENGTH - 1; i > 0;) { t = R ^ sKey[i--]; u = R ^ sKey[i--]; t = t >>> 4 | t << 28; L ^= (SP_TRANS[0x040 | (t & 0x3F)] | SP_TRANS[0x0C0 | ((t >>> 8) & 0x3F)] | SP_TRANS[0x140 | ((t >>> 16) & 0x3F)] | SP_TRANS[0x1C0 | ((t >>> 24) & 0x3F)] | SP_TRANS[ u & 0x3F ] | SP_TRANS[0x080 | ((u >>> 8) & 0x3F)] | SP_TRANS[0x100 | ((u >>> 16) & 0x3F)] | SP_TRANS[0x180 | ((u >>> 24) & 0x3F)]); t = L ^ sKey[i--]; u = L ^ sKey[i--]; t = t >>> 4 | t << 28; R ^= (SP_TRANS[0x040 | (t & 0x3F)] | SP_TRANS[0x0C0 | ((t >>> 8) & 0x3F)] | SP_TRANS[0x140 | ((t >>> 16) & 0x3F)] | SP_TRANS[0x1C0 | ((t >>> 24) & 0x3F)] | SP_TRANS[ u & 0x3F ] | SP_TRANS[0x080 | ((u >>> 8) & 0x3F)] | SP_TRANS[0x100 | ((u >>> 16) & 0x3F)] | SP_TRANS[0x180 | ((u >>> 24) & 0x3F)]); } io[0] = R >>> 1 | R << 31; io[1] = L >>> 1 | L << 31; } private static void initialPermutation (int[] io) { int L = io[0]; int R = io[1]; int t = ((R >>> 4) ^ L) & 0x0F0F0F0F; L ^= t; R ^= t << 4; t = ((L >>> 16) ^ R) & 0x0000FFFF; R ^= t; L ^= t << 16; t = ((R >>> 2) ^ L) & 0x33333333; L ^= t; R ^= t << 2; t = ((L >>> 8) ^ R) & 0x00FF00FF; R ^= t; L ^= t << 8; t = ((R >>> 1) ^ L) & 0x55555555; io[0] = L ^ t; io[1] = R ^ (t << 1); } private static void finalPermutation (int[] io) { int L = io[1]; int R = io[0]; int t = (R >>> 1 ^ L) & 0x55555555; L ^= t; R ^= t << 1; t = (L >>> 8 ^ R) & 0x00FF00FF; R ^= t; L ^= t << 8; t = (R >>> 2 ^ L) & 0x33333333; L ^= t; R ^= t << 2; t = (L >>> 16 ^ R) & 0x0000FFFF; R ^= t; L ^= t << 16; t = (R >>> 4 ^ L) & 0x0F0F0F0F; io[1] = L ^ t; io[0] = R ^ (t << 4); } /** * Implements the Unix crypt(3) algorithm. * <p> * This method is intended only for use by the class * <a href=cryptix.tools.UnixCrypt.html><samp>cryptix.tools.UnixCrypt</samp></a>, * and should not be used directly by applications. * * @param E0 first 32 bits of input. * @param E1 second 32 bits of input. */ public int[] crypt3(int E0, int E1) { if (native_lock != null) { synchronized(native_lock) { int[] result = native_crypt3(native_cookie, E0, E1); if (result == null) throw new CryptixException(getAlgorithm() + ": Error in native code"); return result; } } int L = 0; int R = 0; int t, u, v; for (int i = 0; i < 25; i++) { for (int j = 0; j < ROUNDS * 2;) { v = R ^ (R >>> 16); u = v & E0; v &= E1; u ^= (u << 16) ^ R ^ sKey[j++]; t = v ^ (v << 16) ^ R ^ sKey[j++]; t = t >>> 4 | t << 28; L ^= (SP_TRANS[0x040 | ( t & 0x3F)] | SP_TRANS[0x0C0 | ((t >>> 8) & 0x3F)] | SP_TRANS[0x140 | ((t >>> 16) & 0x3F)] | SP_TRANS[0x1C0 | ((t >>> 24) & 0x3F)] | SP_TRANS[ u & 0x3F ] | SP_TRANS[0x080 | ((u >>> 8) & 0x3F)] | SP_TRANS[0x100 | ((u >>> 16) & 0x3F)] | SP_TRANS[0x180 | ((u >>> 24) & 0x3F)]); v = L ^ (L >>> 16); u = v & E0; v &= E1; u ^= (u << 16) ^ L ^ sKey[j++]; t = v ^ (v << 16) ^ L ^ sKey[j++]; t = t >>> 4 | t << 28; R ^= (SP_TRANS[0x040 | (t & 0x3F)] | SP_TRANS[0x0C0 | ((t >>> 8) & 0x3F)] | SP_TRANS[0x140 | ((t >>> 16) & 0x3F)] | SP_TRANS[0x1C0 | ((t >>> 24) & 0x3F)] | SP_TRANS[ u & 0x3F ] | SP_TRANS[0x080 | ((u >>> 8) & 0x3F)] | SP_TRANS[0x100 | ((u >>> 16) & 0x3F)] | SP_TRANS[0x180 | ((u >>> 24) & 0x3F)]); } t = L; L = R; R = t; } t = L; L = R >>> 1 | R << 31; R = t >>> 1 | t << 31; t = (R >>> 1 ^ L) & 0x55555555; L ^= t; R ^= t << 1; t = (L >>> 8 ^ R) & 0x00FF00FF; R ^= t; L ^= t << 8; t = (R >>> 2 ^ L) & 0x33333333; L ^= t; R ^= t << 2; t = (L >>> 16 ^ R) & 0x0000FFFF; R ^= t; L ^= t << 16; t = (R >>> 4 ^ L) & 0x0F0F0F0F; int[] result = {L ^ t, R ^ (t << 4)}; return result; }// Test methods//........................................................................... /** Entry point for <code>self_test</code>. */ public static void main(String[] argv) { try { self_test(); // time_test(System.out, "1c587f1c13924fef", "305532286d6f295a", "63fac0d034d9f793"); } catch (Exception e) { e.printStackTrace(); } } private static final String[][] tests = {// KEY PLAINTEXT CIPHERTEXT {"0101010101010101", "95f8a5e5dd31d900", "8000000000000000"}, {"0101010101010101", "dd7f121ca5015619", "4000000000000000"}, {"0101010101010101", "2e8653104f3834ea", "2000000000000000"},/* {"0101010101010101", "4bd388ff6cd81d4f", "1000000000000000"}, {"0101010101010101", "20b9e767b2fb1456", "0800000000000000"}, {"0101010101010101", "55579380d77138ef", "0400000000000000"}, {"0101010101010101", "6cc5defaaf04512f", "0200000000000000"}, {"0101010101010101", "0d9f279ba5d87260", "0100000000000000"}, {"0101010101010101", "d9031b0271bd5a0a", "0080000000000000"}, {"0101010101010101", "424250b37c3dd951", "0040000000000000"}, {"0101010101010101", "b8061b7ecd9a21e5", "0020000000000000"}, {"0101010101010101", "f15d0f286b65bd28", "0010000000000000"}, {"0101010101010101", "add0cc8d6e5deba1", "0008000000000000"}, {"0101010101010101", "e6d5f82752ad63d1", "0004000000000000"}, {"0101010101010101", "ecbfe3bd3f591a5e", "0002000000000000"}, {"0101010101010101", "f356834379d165cd", "0001000000000000"},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -