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

📄 desfunc.cs

📁 des算法
💻 CS
📖 第 1 页 / 共 4 页
字号:
            d13[26] = d12[0];
            d13[27] = d12[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c14[i - 2] = c13[i];
            }
            c14[26] = c13[0];
            c14[27] = c13[1];
            for (int i = 2; i < 28; i++)
            {
                d14[i - 2] = d13[i];
            }
            d14[26] = d13[0];
            d14[27] = d13[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c15[i - 2] = c14[i];
            }
            c15[26] = c14[0];
            c15[27] = c14[1];
            for (int i = 2; i < 28; i++)
            {
                d15[i - 2] = d14[i];
            }
            d15[26] = d14[0];
            d15[27] = d14[1];
            //循环左移1位
            for (int i = 1; i < 28; i++)
            {
                c16[i - 1] = c15[i];
            }
            c16[27] = c15[0];
            for (int i = 1; i < 28; i++)
            {
                d16[i - 1] = d15[i];
            }
            d16[27] = d15[0];

            //合并Ci,Di并由PC2置换计算最终16个密钥
            k1 = PC2(c1, d1);
            k2 = PC2(c2, d2);
            k3 = PC2(c3, d3);
            k4 = PC2(c4, d4);
            k5 = PC2(c5, d5);
            k6 = PC2(c6, d6);
            k7 = PC2(c7, d7);
            k8 = PC2(c8, d8);
            k9 = PC2(c9, d9);
            k10 = PC2(c10, d10);
            k11 = PC2(c11, d11);
            k12 = PC2(c12, d12);
            k13 = PC2(c13, d13);
            k14 = PC2(c14, d14);
            k15 = PC2(c15, d15);
            k16 = PC2(c16, d16);

            keyreturn[0] = (int[])k1.Clone();
            keyreturn[1] = (int[])k2.Clone();
            keyreturn[2] = (int[])k3.Clone();
            keyreturn[3] = (int[])k4.Clone();
            keyreturn[4] = (int[])k5.Clone();
            keyreturn[5] = (int[])k6.Clone();
            keyreturn[6] = (int[])k7.Clone();
            keyreturn[7] = (int[])k8.Clone();
            keyreturn[8] = (int[])k9.Clone();
            keyreturn[9] = (int[])k10.Clone();
            keyreturn[10] = (int[])k11.Clone();
            keyreturn[11] = (int[])k12.Clone();
            keyreturn[12] = (int[])k13.Clone();
            keyreturn[13] = (int[])k14.Clone();
            keyreturn[14] = (int[])k15.Clone();
            keyreturn[15] = (int[])k16.Clone();

            return keyreturn;

        }
        //PC2置换
        public int[] PC2(int[] c, int[] d)
        {
            int[] temp = new int[56];
            int[] k = new int[48];
            //合并Ci和Di
            for (int i = 0; i < 28; i++)
            {
                temp[i] = c[i];
                temp[i + 28] = d[i];
            }

            //置换表
            k[0] = temp[13];
            k[1] = temp[16];
            k[2] = temp[10];
            k[3] = temp[23];
            k[4] = temp[0];
            k[5] = temp[4];
            k[6] = temp[2];
            k[7] = temp[27];
            k[8] = temp[14];
            k[9] = temp[5];
            k[10] = temp[20];
            k[11] = temp[9];
            k[12] = temp[22];
            k[13] = temp[18];
            k[14] = temp[11];
            k[15] = temp[3];
            k[16] = temp[25];
            k[17] = temp[7];
            k[18] = temp[15];
            k[19] = temp[6];
            k[20] = temp[26];
            k[21] = temp[19];
            k[22] = temp[12];
            k[23] = temp[1];
            k[24] = temp[40];
            k[25] = temp[51];
            k[26] = temp[30];
            k[27] = temp[36];
            k[28] = temp[46];
            k[29] = temp[54];
            k[30] = temp[29];
            k[31] = temp[39];
            k[32] = temp[50];
            k[33] = temp[44];
            k[34] = temp[32];
            k[35] = temp[47];
            k[36] = temp[43];
            k[37] = temp[48];
            k[38] = temp[38];
            k[39] = temp[55];
            k[40] = temp[33];
            k[41] = temp[52];
            k[42] = temp[45];
            k[43] = temp[41];
            k[44] = temp[49];
            k[45] = temp[35];
            k[46] = temp[28];
            k[47] = temp[31];
            return k;
        }
        //将32位明文2进制形式拓展为48位
        public int[] E(int[] r)
        {
            int i;
            int[] AfterE = new int[48];
            AfterE[0] = r[31];
            for (i = 1; i <= 5; i++)
            {
                AfterE[i] = r[i - 1];
            }
            for (i = 6; i <= 11; i++)
            {
                AfterE[i] = r[i - 3];
            }
            for (i = 12; i <= 17; i++)
            {
                AfterE[i] = r[i - 5];
            }
            for (i = 18; i <= 23; i++)
            {
                AfterE[i] = r[i - 7];
            }
            for (i = 24; i <= 29; i++)
            {
                AfterE[i] = r[i - 9];
            }
            for (i = 30; i <= 35; i++)
            {
                AfterE[i] = r[i - 11];
            }
            for (i = 36; i <= 41; i++)
            {
                AfterE[i] = r[i - 13];
            }
            for (i = 42; i <= 46; i++)
            {
                AfterE[i] = r[i - 15];
            }
            AfterE[47] = r[0];
            return AfterE;
        }
        //g函数
        public int[] g(int[] r, int[] k)
        {
            int[] afterE = E(r);//将明文进行E拓展
            //E拓展后明文分6组的初始化
            int[] m1 = new int[6]; int[] m4 = new int[6]; int[] m7 = new int[6];
            int[] m2 = new int[6]; int[] m5 = new int[6]; int[] m8 = new int[6];
            int[] m3 = new int[6]; int[] m6 = new int[6];
            //明文经过S盒后存放数组初始化
            int[] afterS1 = new int[4]; int[] afterS5 = new int[4];
            int[] afterS2 = new int[4]; int[] afterS6 = new int[4];
            int[] afterS3 = new int[4]; int[] afterS7 = new int[4];
            int[] afterS4 = new int[4]; int[] afterS8 = new int[4];
            int[] afterS = new int[32];
            int[] greturn = new int[32];
            int temp;
            //E拓展后明文与密钥异或
            for (int i = 0; i < 48; i++)
            {
                if (afterE[i] != k[i]) afterE[i] = 1; else afterE[i] = 0;
            }
            //将明文分组
            for (int i = 0; i < 6; i++)
            {
                m1[i] = afterE[i];
                m2[i] = afterE[i + 6];
                m3[i] = afterE[i + 12];
                m4[i] = afterE[i + 18];
                m5[i] = afterE[i + 24];
                m6[i] = afterE[i + 30];
                m7[i] = afterE[i + 36];
                m8[i] = afterE[i + 42];
            }

            //6组明文分别经过S盒后各自输出为afterS1...afterS8
            temp = getS(m1, 1);
            if ((temp & 0x8) != 0) afterS1[0] = 1;
            if ((temp & 0x4) != 0) afterS1[1] = 1;
            if ((temp & 0x2) != 0) afterS1[2] = 1;
            if ((temp & 0x1) != 0) afterS1[3] = 1;
            temp = getS(m2, 2);
            if ((temp & 0x8) != 0) afterS2[0] = 1;
            if ((temp & 0x4) != 0) afterS2[1] = 1;
            if ((temp & 0x2) != 0) afterS2[2] = 1;
            if ((temp & 0x1) != 0) afterS2[3] = 1;
            temp = getS(m3, 3);
            if ((temp & 0x8) != 0) afterS3[0] = 1;
            if ((temp & 0x4) != 0) afterS3[1] = 1;
            if ((temp & 0x2) != 0) afterS3[2] = 1;
            if ((temp & 0x1) != 0) afterS3[3] = 1;
            temp = getS(m4, 4);
            if ((temp & 0x8) != 0) afterS4[0] = 1;
            if ((temp & 0x4) != 0) afterS4[1] = 1;
            if ((temp & 0x2) != 0) afterS4[2] = 1;
            if ((temp & 0x1) != 0) afterS4[3] = 1;
            temp = getS(m5, 5);
            if ((temp & 0x8) != 0) afterS5[0] = 1;
            if ((temp & 0x4) != 0) afterS5[1] = 1;
            if ((temp & 0x2) != 0) afterS5[2] = 1;
            if ((temp & 0x1) != 0) afterS5[3] = 1;
            temp = getS(m6, 6);
            if ((temp & 0x8) != 0) afterS6[0] = 1;
            if ((temp & 0x4) != 0) afterS6[1] = 1;
            if ((temp & 0x2) != 0) afterS6[2] = 1;
            if ((temp & 0x1) != 0) afterS6[3] = 1;
            temp = getS(m7, 7);
            if ((temp & 0x8) != 0) afterS7[0] = 1;
            if ((temp & 0x4) != 0) afterS7[1] = 1;
            if ((temp & 0x2) != 0) afterS7[2] = 1;
            if ((temp & 0x1) != 0) afterS7[3] = 1;
            temp = getS(m8, 8);
            if ((temp & 0x8) != 0) afterS8[0] = 1;
            if ((temp & 0x4) != 0) afterS8[1] = 1;
            if ((temp & 0x2) != 0) afterS8[2] = 1;
            if ((temp & 0x1) != 0) afterS8[3] = 1;

            //合并经过S盒后的明文
            for (int i = 0; i < 4; i++)
            {
                afterS[i] = afterS1[i];
                afterS[i + 4] = afterS2[i];
                afterS[i + 8] = afterS3[i];
                afterS[i + 12] = afterS4[i];
                afterS[i + 16] = afterS5[i];
                afterS[i + 20] = afterS6[i];
                afterS[i + 24] = afterS7[i];
                afterS[i + 28] = afterS8[i];
            }

            //P置换
            greturn[0] = afterS[15];
            greturn[1] = afterS[6];
            greturn[2] = afterS[19];
            greturn[3] = afterS[20];
            greturn[4] = afterS[28];
            greturn[5] = afterS[11];
            greturn[6] = afterS[27];
            greturn[7] = afterS[16];
            greturn[8] = afterS[0];
            greturn[9] = afterS[14];
            greturn[10] = afterS[22];
            greturn[11] = afterS[25];
            greturn[12] = afterS[4];
            greturn[13] = afterS[17];
            greturn[14] = afterS[30];
            greturn[15] = afterS[9];
            greturn[16] = afterS[1];
            greturn[17] = afterS[7];
            greturn[18] = afterS[23];
            greturn[19] = afterS[13];
            greturn[20] = afterS[31];
            greturn[21] = afterS[26];
            greturn[22] = afterS[2];
            greturn[23] = afterS[8];
            greturn[24] = afterS[18];
            greturn[25] = afterS[12];
            greturn[26] = afterS[29];
            greturn[27] = afterS[5];
            greturn[28] = afterS[21];
            greturn[29] = afterS[10];
            greturn[30] = afterS[3];
            greturn[31] = afterS[24];
            return greturn;
        }
        //获得S盒的值
        public int getS(int[] Mi, int i)
        {
            //初始化8个S盒
            int[,] S1 = new int[4, 16]; int[,] S2 = new int[4, 16];
            int[,] S3 = new int[4, 16]; int[,] S4 = new int[4, 16];
            int[,] S5 = new int[4, 16]; int[,] S6 = new int[4, 16];
            int[,] S7 = new int[4, 16]; int[,] S8 = new int[4, 16];
            int[] output = new int[8];
            int j, k;
            //8个S盒
            S1[0, 0] = 14;
            S1[0, 1] = 4;
            S1[0, 2] = 13;
            S1[0, 3] = 1;
            S1[0, 4] = 2;
            S1[0, 5] = 15;
            S1[0, 6] = 11;
            S1[0, 7] = 8;
            S1[0, 8] = 3;
            S1[0, 9] = 10;
            S1[0, 10] = 6;
            S1[0, 11] = 12;
            S1[0, 12] = 5;
            S1[0, 13] = 9;
            S1[0, 14] = 0;
            S1[0, 15] = 7;
            S1[1, 0] = 0;
            S1[1, 1] = 15;
            S1[1, 2] = 7;
            S1[1, 3] = 4;
            S1[1, 4] = 14;
            S1[1, 5] = 2;
            S1[1, 6] = 13;
            S1[1, 7] = 1;
            S1[1, 8] = 10;
            S1[1, 9] = 6;
            S1[1, 10] = 12;
            S1[1, 11] = 11;
            S1[1, 12] = 9;
            S1[1, 13] = 5;
            S1[1, 14] = 3;
            S1[1, 15] = 8;
            S1[2, 0] = 4;
            S1[2, 1] = 1;
            S1[2, 2] = 14;
            S1[2, 3] = 8;
            S1[2, 4] = 13;
            S1[2, 5] = 6;
            S1[2, 6] = 2;
            S1[2, 7] = 11;
            S1[2, 8] = 15;
            S1[2, 9] = 12;
            S1[2, 10] = 9;
            S1[2, 11] = 7;
            S1[2, 12] = 3;
            S1[2, 13] = 10;
            S1[2, 14] = 5;
            S1[2, 15] = 0;
            S1[3, 0] = 15;
            S1[3, 1] = 12;
            S1[3, 2] = 8;
            S1[3, 3] = 2;
            S1[3, 4] = 4;
            S1[3, 5] = 9;
            S1[3, 6] = 1;
            S1[3, 7] = 7;
            S1[3, 8] = 5;
            S1[3, 9] = 11;
            S1[3, 10] = 3;
            S1[3, 11] = 14;
            S1[3, 12] = 10;
            S1[3, 13] = 0;
            S1[3, 14] = 6;
            S1[3, 15] = 13;

            S2[0, 0] = 15;
            S2[0, 1] = 1;
            S2[0, 2] = 8;
            S2[0, 3] = 14;
            S2[0, 4] = 6;
            S2[0, 5] = 11;
            S2[0, 6] = 3;
            S2[0, 7] = 4;
            S2[0, 8] = 9;
            S2[0, 9] = 7;
            S2[0, 10] = 2;
            S2[0, 11] = 13;
            S2[0, 12] = 12;

⌨️ 快捷键说明

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