Пример #1
0
        public static void DES_ecb_encrypt_one(byte[] inBytesTotal, uint startPos, uint inLen, ref byte[] outBytesTotal,
                                               DES_key_schedule ks, int enc, CryptContext cryptContext)
        {
            int len_ = (((int)inLen + 7) / 8) * 8;

            outBytesTotal = new byte[len_];

            byte[] inBytes  = new byte[8];
            byte[] outBytes = new byte[8];

            int idx = 0;

            for (idx = 0; idx <= inLen - 8; idx += 8)
            {
                //if (idx % 16 == 0)  // 如果是 16 的整数倍
                //{
                // 保证 8 个字节
                CryptUtil.get8Byte(inBytesTotal, (int)startPos + idx, inBytes);
                DES_ecb_encrypt(inBytes, outBytes, ks, enc);
                Array.Copy(outBytes, 0, outBytesTotal, idx, 8);
                //}
                //else
                //{
                //    Array.Copy(inBytesTotal, idx, outBytesTotal, idx, 8);
                //}
            }
        }
Пример #2
0
        protected void testDes()
        {
            //string testStr = "asdfasdf5";
            //byte[] inBytes = System.Text.Encoding.UTF8.GetBytes(testStr);
            //byte[] key = { 0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC };
            byte[] key = { 26, 32, 127, 193, 251, 239, 174, 97 };
            //byte[] inBytes = { 0x3f, 0x79, 0xd5, 0xe2, 0x4a, 0x8c, 0xb6, 0xc1, 0x3f, 0x79, 0xd5, 0xe2, 0x4a, 0x8c, 0xb6, 0xc1 };
            byte[] inBytes = { 0x0c, 0x00, 0x00, 0x00, 0x03, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
            byte[] outBytes = new byte[16];
            uint inSize = (uint)inBytes.Length;

            DES_key_schedule des5Key = new DES_key_schedule();     // RC5 key
            Dec.DES_set_key_unchecked(key, des5Key);

            CryptContext cryptContext = new CryptContext();
            cryptContext.m_cryptAlgorithm = CryptAlgorithm.DES;
            cryptContext.setCryptKey(key);

            //Crypt.encryptData(inBytes, 0, 16, ref outBytes, des5Key, CryptAlgorithm.DES);
            //Crypt.decryptData(outBytes, 0, 16, ref inBytes, des5Key, CryptAlgorithm.DES);
            //testStr = System.Text.Encoding.UTF8.GetString(inBytes);
            Crypt.decryptData(inBytes, 0, 16, ref outBytes, cryptContext);
        }
Пример #3
0
        public static void DES_ecb_encrypt(byte[] input, byte[] output,
                                           DES_key_schedule ks, int enc)
        {
            ulong l = 0;

            ulong[] ll         = new ulong[2];
            byte[]  in_input   = input;
            byte[]  out_output = output;

            int c2l_in_input_startIdx   = 0;
            int l2c_out_output_startIdx = 0;

            CryptUtil.c2l(in_input, ref l, ref c2l_in_input_startIdx);
            ll[0] = l;
            CryptUtil.c2l(in_input, ref l, ref c2l_in_input_startIdx);
            ll[1] = l;
            DES_encrypt1(ll, ks, enc);
            l = ll[0];
            CryptUtil.l2c(l, out_output, ref l2c_out_output_startIdx);
            l = ll[1];
            CryptUtil.l2c(l, out_output, ref l2c_out_output_startIdx);
            l = ll[0] = ll[1] = 0;
        }
Пример #4
0
        public static void DES_ecb_encrypt_one(byte[] inBytesTotal, uint startPos, uint inLen, ref byte[] outBytesTotal,
                     DES_key_schedule ks, int enc, CryptContext cryptContext)
        {
            int len_ = (((int)inLen + 7) / 8) * 8;
            outBytesTotal = new byte[len_];

            byte[] inBytes = new byte[8];
            byte[] outBytes = new byte[8];

            int idx = 0;
            for (idx = 0; idx <= inLen - 8; idx += 8)
            {
                //if (idx % 16 == 0)  // 如果是 16 的整数倍
                //{
                    // 保证 8 个字节
                    CryptUtil.get8Byte(inBytesTotal, (int)startPos + idx, inBytes);
                    DES_ecb_encrypt(inBytes, outBytes, ks, enc);
                    Array.Copy(outBytes, 0, outBytesTotal, idx, 8);
                //}
                //else
                //{
                //    Array.Copy(inBytesTotal, idx, outBytesTotal, idx, 8);
                //}
            }
        }
Пример #5
0
        public static void DES_ecb_encrypt(byte[] input, byte[] output,
                     DES_key_schedule ks, int enc)
        {
            ulong l = 0;
            ulong[] ll = new ulong[2];
            byte[] in_input = input;
            byte[] out_output = output;

            int c2l_in_input_startIdx = 0;
            int l2c_out_output_startIdx = 0;

            CryptUtil.c2l(in_input, ref l, ref c2l_in_input_startIdx);
            ll[0] = l;
            CryptUtil.c2l(in_input, ref l, ref c2l_in_input_startIdx);
            ll[1] = l;
            DES_encrypt1(ll, ks, enc);
            l = ll[0];
            CryptUtil.l2c(l, out_output, ref l2c_out_output_startIdx);
            l = ll[1];
            CryptUtil.l2c(l, out_output, ref l2c_out_output_startIdx);
            l = ll[0] = ll[1] = 0;
        }
Пример #6
0
        public static void DES_encrypt1(ulong[] data, DES_key_schedule ks, int enc)
        {
            ulong l = 0, r = 0, t = 0, u = 0;
            //int i = 0;
            ulong[] s = null;

            r = data[0];
            l = data[1];

            CryptUtil.IP(ref r, ref l);
            /*
             * Things have been modified so that the initial rotate is done outside
             * the loop.  This required the DES_SPtrans values in sp.h to be rotated
             * 1 bit to the right. One perl script later and things have a 5% speed
             * up on a sparc2. Thanks to Richard Outerbridge
             * <*****@*****.**> for pointing this out.
             */
            /* clear the top bits on machines with 8byte longs */
            /* shift left by 2 */
            r = CryptUtil.ROTATE(r, 29) & 0xffffffffL;
            l = CryptUtil.ROTATE(l, 29) & 0xffffffffL;

            //s = ks.ks[0].deslong;
            /*
             * I don't know if it is worth the effort of loop unrolling the inner
             * loop
             */
            if (enc != 0) {
                s = ks.ks[0].deslong;
                D_ENCRYPT(ref l, r, 0, s, ref u, ref t);     /* 1 */
                s = ks.ks[1].deslong;
                D_ENCRYPT(ref r, l, 2, s, ref u, ref t);     /* 2 */
                s = ks.ks[2].deslong;
                D_ENCRYPT(ref l, r, 4, s, ref u, ref t);     /* 3 */
                s = ks.ks[3].deslong;
                D_ENCRYPT(ref r, l, 6, s, ref u, ref t);     /* 4 */
                s = ks.ks[4].deslong;
                D_ENCRYPT(ref l, r, 8, s, ref u, ref t);     /* 5 */
                s = ks.ks[5].deslong;
                D_ENCRYPT(ref r, l, 10, s, ref u, ref t);    /* 6 */
                s = ks.ks[6].deslong;
                D_ENCRYPT(ref l, r, 12, s, ref u, ref t);    /* 7 */
                s = ks.ks[7].deslong;
                D_ENCRYPT(ref r, l, 14, s, ref u, ref t);    /* 8 */
                s = ks.ks[8].deslong;
                D_ENCRYPT(ref l, r, 16, s, ref u, ref t);    /* 9 */
                s = ks.ks[9].deslong;
                D_ENCRYPT(ref r, l, 18, s, ref u, ref t);    /* 10 */
                s = ks.ks[10].deslong;
                D_ENCRYPT(ref l, r, 20, s, ref u, ref t);    /* 11 */
                s = ks.ks[11].deslong;
                D_ENCRYPT(ref r, l, 22, s, ref u, ref t);    /* 12 */
                s = ks.ks[12].deslong;
                D_ENCRYPT(ref l, r, 24, s, ref u, ref t);    /* 13 */
                s = ks.ks[13].deslong;
                D_ENCRYPT(ref r, l, 26, s, ref u, ref t);    /* 14 */
                s = ks.ks[14].deslong;
                D_ENCRYPT(ref l, r, 28, s, ref u, ref t);    /* 15 */
                s = ks.ks[15].deslong;
                D_ENCRYPT(ref r, l, 30, s, ref u, ref t);    /* 16 */
            } 
            else 
            {
                s = ks.ks[15].deslong;
                D_ENCRYPT(ref l, r, 30, s, ref u, ref t);    /* 16 */
                s = ks.ks[14].deslong;
                D_ENCRYPT(ref r, l, 28, s, ref u, ref t);    /* 15 */
                s = ks.ks[13].deslong;
                D_ENCRYPT(ref l, r, 26, s, ref u, ref t);    /* 14 */
                s = ks.ks[12].deslong;
                D_ENCRYPT(ref r, l, 24, s, ref u, ref t);    /* 13 */
                s = ks.ks[11].deslong;
                D_ENCRYPT(ref l, r, 22, s, ref u, ref t);    /* 12 */
                s = ks.ks[10].deslong;
                D_ENCRYPT(ref r, l, 20, s, ref u, ref t);    /* 11 */
                s = ks.ks[9].deslong;
                D_ENCRYPT(ref l, r, 18, s, ref u, ref t);    /* 10 */
                s = ks.ks[8].deslong;
                D_ENCRYPT(ref r, l, 16, s, ref u, ref t);    /* 9 */
                s = ks.ks[7].deslong;
                D_ENCRYPT(ref l, r, 14, s, ref u, ref t);    /* 8 */
                s = ks.ks[6].deslong;
                D_ENCRYPT(ref r, l, 12, s, ref u, ref t);    /* 7 */
                s = ks.ks[5].deslong;
                D_ENCRYPT(ref l, r, 10, s, ref u, ref t);    /* 6 */
                s = ks.ks[4].deslong;
                D_ENCRYPT(ref r, l, 8, s, ref u, ref t);     /* 5 */
                s = ks.ks[3].deslong;
                D_ENCRYPT(ref l, r, 6, s, ref u, ref t);     /* 4 */
                s = ks.ks[2].deslong;
                D_ENCRYPT(ref r, l, 4, s, ref u, ref t);     /* 3 */
                s = ks.ks[1].deslong;
                D_ENCRYPT(ref l, r, 2, s, ref u, ref t);     /* 2 */
                s = ks.ks[0].deslong;
                D_ENCRYPT(ref r, l, 0, s, ref u, ref t);     /* 1 */
            }

            /* rotate and clear the top bits on machines with 8byte longs */
            l = CryptUtil.ROTATE(l, 3) & 0xffffffffL;
            r = CryptUtil.ROTATE(r, 3) & 0xffffffffL;

            CryptUtil.FP(ref r, ref l);
            data[0] = l;
            data[1] = r;
            l = r = t = u = 0;
        }
Пример #7
0
        public static void DES_set_key_unchecked(byte[] key, DES_key_schedule schedule)
        {
            ulong c = 0, d = 0, t = 0, s = 0, t2 = 0;
            byte[] in_Key;
            ulong[] k;
            int i;

            in_Key = key;

            int c2l_in_Key_startIdx = 0;
            CryptUtil.c2l(in_Key, ref c, ref c2l_in_Key_startIdx);
            CryptUtil.c2l(in_Key, ref d, ref c2l_in_Key_startIdx);

            /*
             * do PC1 in 47 simple operations :-) Thanks to John Fletcher
             * ([email protected]) for the inspiration. :-)
             */
            CryptUtil.PERM_OP(ref d, ref c, ref t, 4, 0x0f0f0f0fL);
            CryptUtil.HPERM_OP(ref c, t, -2, 0xcccc0000L);
            CryptUtil.HPERM_OP(ref d, t, -2, 0xcccc0000L);
            CryptUtil.PERM_OP(ref d, ref c, ref t, 1, 0x55555555L);
            CryptUtil.PERM_OP(ref c, ref d, ref t, 8, 0x00ff00ffL);
            CryptUtil.PERM_OP(ref d, ref c, ref t, 1, 0x55555555L);
            d = (((d & 0x000000ffL) << (int)16L) | (d & 0x0000ff00L) |
                 ((d & 0x00ff0000L) >> (int)16L) | ((c & 0xf0000000L) >> (int)4L));
            c &= 0x0fffffffL;

            for (i = 0; i < ITERATIONS; i++) {
                k = schedule.ks[i].deslong;

                if (shifts2[i] != 0) {
                    c = ((c >> (int)2L) | (c << (int)26L));
                    d = ((d >> (int)2L) | (d << (int)26L));
                } else {
                    c = ((c >> (int)1L) | (c << (int)27L));
                    d = ((d >> (int)1L) | (d << (int)27L));
                }
                c &= 0x0fffffffL;
                d &= 0x0fffffffL;
                /*
                 * could be a few less shifts but I am to lazy at this point in time
                 * to investigate
                 */
                s = des_skb[0, (c) & 0x3f] |
                    des_skb[1, ((c >> (int)6L) & 0x03) | ((c >> (int)7L) & 0x3c)] |
                    des_skb[2, ((c >> (int)13L) & 0x0f) | ((c >> (int)14L) & 0x30)] |
                    des_skb[3, ((c >> (int)20L) & 0x01) | ((c >> (int)21L) & 0x06) |
                               ((c >> (int)22L) & 0x38)];
                t = des_skb[4, (d) & 0x3f] |
                    des_skb[5, ((d >> (int)7L) & 0x03) | ((d >> (int)8L) & 0x3c)] |
                    des_skb[6, (d >> (int)15L) & 0x3f] |
                    des_skb[7, ((d >> (int)21L) & 0x0f) | ((d >> (int)22L) & 0x30)];

                /* table contained 0213 4657 */
                t2 = ((t << (int)16L) | (s & 0x0000ffffL)) & 0xffffffffL;
                k[0] = CryptUtil.ROTATE(t2, 30) & 0xffffffffL;

                t2 = ((s >> (int)16L) | (t & 0xffff0000L));
                k[1] = CryptUtil.ROTATE(t2, 26) & 0xffffffffL;
            }
        }
Пример #8
0
        public static void DES_encrypt1(ulong[] data, DES_key_schedule ks, int enc)
        {
            ulong l = 0, r = 0, t = 0, u = 0;

            //int i = 0;
            ulong[] s = null;

            r = data[0];
            l = data[1];

            CryptUtil.IP(ref r, ref l);

            /*
             * Things have been modified so that the initial rotate is done outside
             * the loop.  This required the DES_SPtrans values in sp.h to be rotated
             * 1 bit to the right. One perl script later and things have a 5% speed
             * up on a sparc2. Thanks to Richard Outerbridge
             * <*****@*****.**> for pointing this out.
             */
            /* clear the top bits on machines with 8byte longs */
            /* shift left by 2 */
            r = CryptUtil.ROTATE(r, 29) & 0xffffffffL;
            l = CryptUtil.ROTATE(l, 29) & 0xffffffffL;

            //s = ks.ks[0].deslong;

            /*
             * I don't know if it is worth the effort of loop unrolling the inner
             * loop
             */
            if (enc != 0)
            {
                s = ks.ks[0].deslong;
                D_ENCRYPT(ref l, r, 0, s, ref u, ref t);     /* 1 */
                s = ks.ks[1].deslong;
                D_ENCRYPT(ref r, l, 2, s, ref u, ref t);     /* 2 */
                s = ks.ks[2].deslong;
                D_ENCRYPT(ref l, r, 4, s, ref u, ref t);     /* 3 */
                s = ks.ks[3].deslong;
                D_ENCRYPT(ref r, l, 6, s, ref u, ref t);     /* 4 */
                s = ks.ks[4].deslong;
                D_ENCRYPT(ref l, r, 8, s, ref u, ref t);     /* 5 */
                s = ks.ks[5].deslong;
                D_ENCRYPT(ref r, l, 10, s, ref u, ref t);    /* 6 */
                s = ks.ks[6].deslong;
                D_ENCRYPT(ref l, r, 12, s, ref u, ref t);    /* 7 */
                s = ks.ks[7].deslong;
                D_ENCRYPT(ref r, l, 14, s, ref u, ref t);    /* 8 */
                s = ks.ks[8].deslong;
                D_ENCRYPT(ref l, r, 16, s, ref u, ref t);    /* 9 */
                s = ks.ks[9].deslong;
                D_ENCRYPT(ref r, l, 18, s, ref u, ref t);    /* 10 */
                s = ks.ks[10].deslong;
                D_ENCRYPT(ref l, r, 20, s, ref u, ref t);    /* 11 */
                s = ks.ks[11].deslong;
                D_ENCRYPT(ref r, l, 22, s, ref u, ref t);    /* 12 */
                s = ks.ks[12].deslong;
                D_ENCRYPT(ref l, r, 24, s, ref u, ref t);    /* 13 */
                s = ks.ks[13].deslong;
                D_ENCRYPT(ref r, l, 26, s, ref u, ref t);    /* 14 */
                s = ks.ks[14].deslong;
                D_ENCRYPT(ref l, r, 28, s, ref u, ref t);    /* 15 */
                s = ks.ks[15].deslong;
                D_ENCRYPT(ref r, l, 30, s, ref u, ref t);    /* 16 */
            }
            else
            {
                s = ks.ks[15].deslong;
                D_ENCRYPT(ref l, r, 30, s, ref u, ref t);    /* 16 */
                s = ks.ks[14].deslong;
                D_ENCRYPT(ref r, l, 28, s, ref u, ref t);    /* 15 */
                s = ks.ks[13].deslong;
                D_ENCRYPT(ref l, r, 26, s, ref u, ref t);    /* 14 */
                s = ks.ks[12].deslong;
                D_ENCRYPT(ref r, l, 24, s, ref u, ref t);    /* 13 */
                s = ks.ks[11].deslong;
                D_ENCRYPT(ref l, r, 22, s, ref u, ref t);    /* 12 */
                s = ks.ks[10].deslong;
                D_ENCRYPT(ref r, l, 20, s, ref u, ref t);    /* 11 */
                s = ks.ks[9].deslong;
                D_ENCRYPT(ref l, r, 18, s, ref u, ref t);    /* 10 */
                s = ks.ks[8].deslong;
                D_ENCRYPT(ref r, l, 16, s, ref u, ref t);    /* 9 */
                s = ks.ks[7].deslong;
                D_ENCRYPT(ref l, r, 14, s, ref u, ref t);    /* 8 */
                s = ks.ks[6].deslong;
                D_ENCRYPT(ref r, l, 12, s, ref u, ref t);    /* 7 */
                s = ks.ks[5].deslong;
                D_ENCRYPT(ref l, r, 10, s, ref u, ref t);    /* 6 */
                s = ks.ks[4].deslong;
                D_ENCRYPT(ref r, l, 8, s, ref u, ref t);     /* 5 */
                s = ks.ks[3].deslong;
                D_ENCRYPT(ref l, r, 6, s, ref u, ref t);     /* 4 */
                s = ks.ks[2].deslong;
                D_ENCRYPT(ref r, l, 4, s, ref u, ref t);     /* 3 */
                s = ks.ks[1].deslong;
                D_ENCRYPT(ref l, r, 2, s, ref u, ref t);     /* 2 */
                s = ks.ks[0].deslong;
                D_ENCRYPT(ref r, l, 0, s, ref u, ref t);     /* 1 */
            }

            /* rotate and clear the top bits on machines with 8byte longs */
            l = CryptUtil.ROTATE(l, 3) & 0xffffffffL;
            r = CryptUtil.ROTATE(r, 3) & 0xffffffffL;

            CryptUtil.FP(ref r, ref l);
            data[0] = l;
            data[1] = r;
            l       = r = t = u = 0;
        }
Пример #9
0
        public static void DES_set_key_unchecked(byte[] key, DES_key_schedule schedule)
        {
            ulong c = 0, d = 0, t = 0, s = 0, t2 = 0;

            byte[]  in_Key;
            ulong[] k;
            int     i;

            in_Key = key;

            int c2l_in_Key_startIdx = 0;

            CryptUtil.c2l(in_Key, ref c, ref c2l_in_Key_startIdx);
            CryptUtil.c2l(in_Key, ref d, ref c2l_in_Key_startIdx);

            /*
             * do PC1 in 47 simple operations :-) Thanks to John Fletcher
             * ([email protected]) for the inspiration. :-)
             */
            CryptUtil.PERM_OP(ref d, ref c, ref t, 4, 0x0f0f0f0fL);
            CryptUtil.HPERM_OP(ref c, t, -2, 0xcccc0000L);
            CryptUtil.HPERM_OP(ref d, t, -2, 0xcccc0000L);
            CryptUtil.PERM_OP(ref d, ref c, ref t, 1, 0x55555555L);
            CryptUtil.PERM_OP(ref c, ref d, ref t, 8, 0x00ff00ffL);
            CryptUtil.PERM_OP(ref d, ref c, ref t, 1, 0x55555555L);
            d = (((d & 0x000000ffL) << (int)16L) | (d & 0x0000ff00L) |
                 ((d & 0x00ff0000L) >> (int)16L) | ((c & 0xf0000000L) >> (int)4L));
            c &= 0x0fffffffL;

            for (i = 0; i < ITERATIONS; i++)
            {
                k = schedule.ks[i].deslong;

                if (shifts2[i] != 0)
                {
                    c = ((c >> (int)2L) | (c << (int)26L));
                    d = ((d >> (int)2L) | (d << (int)26L));
                }
                else
                {
                    c = ((c >> (int)1L) | (c << (int)27L));
                    d = ((d >> (int)1L) | (d << (int)27L));
                }
                c &= 0x0fffffffL;
                d &= 0x0fffffffL;

                /*
                 * could be a few less shifts but I am to lazy at this point in time
                 * to investigate
                 */
                s = des_skb[0, (c) & 0x3f] |
                    des_skb[1, ((c >> (int)6L) & 0x03) | ((c >> (int)7L) & 0x3c)] |
                    des_skb[2, ((c >> (int)13L) & 0x0f) | ((c >> (int)14L) & 0x30)] |
                    des_skb[3, ((c >> (int)20L) & 0x01) | ((c >> (int)21L) & 0x06) |
                            ((c >> (int)22L) & 0x38)];
                t = des_skb[4, (d) & 0x3f] |
                    des_skb[5, ((d >> (int)7L) & 0x03) | ((d >> (int)8L) & 0x3c)] |
                    des_skb[6, (d >> (int)15L) & 0x3f] |
                    des_skb[7, ((d >> (int)21L) & 0x0f) | ((d >> (int)22L) & 0x30)];

                /* table contained 0213 4657 */
                t2   = ((t << (int)16L) | (s & 0x0000ffffL)) & 0xffffffffL;
                k[0] = CryptUtil.ROTATE(t2, 30) & 0xffffffffL;

                t2   = ((s >> (int)16L) | (t & 0xffff0000L));
                k[1] = CryptUtil.ROTATE(t2, 26) & 0xffffffffL;
            }
        }