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

📄 des.java

📁 jpeg2000编解码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
        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 + -