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

📄 desfunc.cs

📁 des算法
💻 CS
📖 第 1 页 / 共 4 页
字号:
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion

namespace DesFunc          //DES加密函数库
{
    public class DesFunc
    {

        //IP置换
        public int[] IP(char[] mchar)
        {
            int[] mint = new int[64];
            int[] mreturn = new int[64];
            for (int i = 0; i < mint.Length; i++)
            {
                mint[i] = 0;
            }

            //将char明文转化为2进制明文
            for (int i = 0; i < mchar.Length; i++)
            {
                if ((mchar[i] & 0x80) != 0) mint[i * 8 + 0] = 1;
                if ((mchar[i] & 0x40) != 0) mint[i * 8 + 1] = 1;
                if ((mchar[i] & 0x20) != 0) mint[i * 8 + 2] = 1;
                if ((mchar[i] & 0x10) != 0) mint[i * 8 + 3] = 1;
                if ((mchar[i] & 0x8) != 0) mint[i * 8 + 4] = 1;
                if ((mchar[i] & 0x4) != 0) mint[i * 8 + 5] = 1;
                if ((mchar[i] & 0x2) != 0) mint[i * 8 + 6] = 1;
                if ((mchar[i] & 0x1) != 0) mint[i * 8 + 7] = 1;
            }

            //置换表
            mreturn[0] = mint[57]; mreturn[1] = mint[49]; mreturn[2] = mint[41];
            mreturn[3] = mint[33]; mreturn[4] = mint[25]; mreturn[5] = mint[17];
            mreturn[6] = mint[9]; mreturn[7] = mint[1]; mreturn[8] = mint[59];
            mreturn[9] = mint[51]; mreturn[10] = mint[43]; mreturn[11] = mint[35];
            mreturn[12] = mint[27]; mreturn[13] = mint[19]; mreturn[14] = mint[11];
            mreturn[15] = mint[3]; mreturn[16] = mint[61]; mreturn[17] = mint[53];
            mreturn[18] = mint[45]; mreturn[19] = mint[37]; mreturn[20] = mint[29];
            mreturn[21] = mint[21]; mreturn[22] = mint[13]; mreturn[23] = mint[5];
            mreturn[24] = mint[63]; mreturn[25] = mint[55]; mreturn[26] = mint[47];
            mreturn[27] = mint[39]; mreturn[28] = mint[31]; mreturn[29] = mint[23];
            mreturn[30] = mint[15]; mreturn[31] = mint[7]; mreturn[32] = mint[56];
            mreturn[33] = mint[48]; mreturn[34] = mint[40]; mreturn[35] = mint[32];
            mreturn[36] = mint[24]; mreturn[37] = mint[16]; mreturn[38] = mint[8];
            mreturn[39] = mint[0]; mreturn[40] = mint[58]; mreturn[41] = mint[50];
            mreturn[42] = mint[42]; mreturn[43] = mint[34]; mreturn[44] = mint[26];
            mreturn[45] = mint[18]; mreturn[46] = mint[10]; mreturn[47] = mint[2];
            mreturn[48] = mint[60]; mreturn[49] = mint[52]; mreturn[50] = mint[44];
            mreturn[51] = mint[36]; mreturn[52] = mint[28]; mreturn[53] = mint[20];
            mreturn[54] = mint[12]; mreturn[55] = mint[4]; mreturn[56] = mint[62];
            mreturn[57] = mint[54]; mreturn[58] = mint[46]; mreturn[59] = mint[38];
            mreturn[60] = mint[30]; mreturn[61] = mint[22]; mreturn[62] = mint[14];
            mreturn[63] = mint[6];
            return mreturn;
        }
        //IP-1置换
        public int[] IP_1(int[] mchar)
        {
            //置换表
            int[] IPreturn = new int[64];
            IPreturn[0] = mchar[39];
            IPreturn[1] = mchar[7];
            IPreturn[2] = mchar[47];
            IPreturn[3] = mchar[15];
            IPreturn[4] = mchar[55];
            IPreturn[5] = mchar[23];
            IPreturn[6] = mchar[63];
            IPreturn[7] = mchar[31];
            IPreturn[8] = mchar[38];
            IPreturn[9] = mchar[6];
            IPreturn[10] = mchar[46];
            IPreturn[11] = mchar[14];
            IPreturn[12] = mchar[54];
            IPreturn[13] = mchar[22];
            IPreturn[14] = mchar[62];
            IPreturn[15] = mchar[30];
            IPreturn[16] = mchar[37];
            IPreturn[17] = mchar[5];
            IPreturn[18] = mchar[45];
            IPreturn[19] = mchar[13];
            IPreturn[20] = mchar[53];
            IPreturn[21] = mchar[21];
            IPreturn[22] = mchar[61];
            IPreturn[23] = mchar[29];
            IPreturn[24] = mchar[36];
            IPreturn[25] = mchar[4];
            IPreturn[26] = mchar[44];
            IPreturn[27] = mchar[12];
            IPreturn[28] = mchar[52];
            IPreturn[29] = mchar[20];
            IPreturn[30] = mchar[60];
            IPreturn[31] = mchar[28];
            IPreturn[32] = mchar[35];
            IPreturn[33] = mchar[3];
            IPreturn[34] = mchar[43];
            IPreturn[35] = mchar[11];
            IPreturn[36] = mchar[51];
            IPreturn[37] = mchar[19];
            IPreturn[38] = mchar[59];
            IPreturn[39] = mchar[27];
            IPreturn[40] = mchar[34];
            IPreturn[41] = mchar[2];
            IPreturn[42] = mchar[42];
            IPreturn[43] = mchar[10];
            IPreturn[44] = mchar[50];
            IPreturn[45] = mchar[18];
            IPreturn[46] = mchar[58];
            IPreturn[47] = mchar[26];
            IPreturn[48] = mchar[33];
            IPreturn[49] = mchar[1];
            IPreturn[50] = mchar[41];
            IPreturn[51] = mchar[9];
            IPreturn[52] = mchar[49];
            IPreturn[53] = mchar[17];
            IPreturn[54] = mchar[57];
            IPreturn[55] = mchar[25];
            IPreturn[56] = mchar[32];
            IPreturn[57] = mchar[0];
            IPreturn[58] = mchar[40];
            IPreturn[59] = mchar[8];
            IPreturn[60] = mchar[48];
            IPreturn[61] = mchar[16];
            IPreturn[62] = mchar[56];
            IPreturn[63] = mchar[24];
            return IPreturn;
        }
        //64位原始密钥计算16个48位密钥
        public int[][] makekey(char[] kchar)
        {
            //16位数组存放16个输出密钥
            int[][] keyreturn = new int[16][];
            int[] temp = new int[64];
            int[] kint = new int[56];
            int[] c0 = new int[28]; int[] d0 = new int[28];
            int[] c16 = new int[28]; int[] d1 = new int[28];
            int[] c1 = new int[28]; int[] d2 = new int[28];
            int[] c2 = new int[28]; int[] d3 = new int[28];
            int[] c3 = new int[28]; int[] d4 = new int[28];
            int[] c4 = new int[28]; int[] d5 = new int[28];
            int[] c5 = new int[28]; int[] d6 = new int[28];
            int[] c6 = new int[28]; int[] d7 = new int[28];
            int[] c7 = new int[28]; int[] d8 = new int[28];
            int[] c8 = new int[28]; int[] d9 = new int[28];
            int[] c9 = new int[28]; int[] d10 = new int[28];
            int[] c10 = new int[28]; int[] d11 = new int[28];
            int[] c11 = new int[28]; int[] d12 = new int[28];
            int[] c12 = new int[28]; int[] d13 = new int[28];
            int[] c13 = new int[28]; int[] d14 = new int[28];
            int[] c14 = new int[28]; int[] d15 = new int[28];
            int[] c15 = new int[28]; int[] d16 = new int[28];
            int[] k1 = new int[48]; int[] k2 = new int[48]; int[] k3 = new int[48];
            int[] k4 = new int[48]; int[] k5 = new int[48]; int[] k6 = new int[48];
            int[] k7 = new int[48]; int[] k8 = new int[48]; int[] k9 = new int[48];
            int[] k10 = new int[48]; int[] k11 = new int[48]; int[] k12 = new int[48];
            int[] k13 = new int[48]; int[] k14 = new int[48]; int[] k15 = new int[48];
            int[] k16 = new int[48];

            //获得原始密钥2进制形式
            for (int i = 0; i < kchar.Length; i++)
            {
                if ((kchar[i] & 0x80) != 0) temp[i * 8 + 0] = 1;
                if ((kchar[i] & 0x40) != 0) temp[i * 8 + 1] = 1;
                if ((kchar[i] & 0x20) != 0) temp[i * 8 + 2] = 1;
                if ((kchar[i] & 0x10) != 0) temp[i * 8 + 3] = 1;
                if ((kchar[i] & 0x8) != 0) temp[i * 8 + 4] = 1;
                if ((kchar[i] & 0x4) != 0) temp[i * 8 + 5] = 1;
                if ((kchar[i] & 0x2) != 0) temp[i * 8 + 6] = 1;
                if ((kchar[i] & 0x1) != 0) temp[i * 8 + 7] = 1;
            }

            //去掉奇校检位并打乱
            kint[0] = temp[56];
            kint[1] = temp[48];
            kint[2] = temp[40];
            kint[3] = temp[32];
            kint[4] = temp[24];
            kint[5] = temp[16];
            kint[6] = temp[8];
            kint[7] = temp[0];
            kint[8] = temp[57];
            kint[9] = temp[49];
            kint[10] = temp[41];
            kint[11] = temp[33];
            kint[12] = temp[25];
            kint[13] = temp[17];
            kint[14] = temp[9];
            kint[15] = temp[1];
            kint[16] = temp[58];
            kint[17] = temp[50];
            kint[18] = temp[42];
            kint[19] = temp[34];
            kint[20] = temp[26];
            kint[21] = temp[18];
            kint[22] = temp[10];
            kint[23] = temp[2];
            kint[24] = temp[59];
            kint[25] = temp[51];
            kint[26] = temp[43];
            kint[27] = temp[35];
            kint[28] = temp[62];
            kint[29] = temp[54];
            kint[30] = temp[46];
            kint[31] = temp[38];
            kint[32] = temp[30];
            kint[33] = temp[22];
            kint[34] = temp[14];
            kint[35] = temp[6];
            kint[36] = temp[61];
            kint[37] = temp[53];
            kint[38] = temp[45];
            kint[39] = temp[37];
            kint[40] = temp[29];
            kint[41] = temp[21];
            kint[42] = temp[13];
            kint[43] = temp[5];
            kint[44] = temp[60];
            kint[45] = temp[52];
            kint[46] = temp[44];
            kint[47] = temp[36];
            kint[48] = temp[28];
            kint[49] = temp[20];
            kint[50] = temp[12];
            kint[51] = temp[4];
            kint[52] = temp[27];
            kint[53] = temp[19];
            kint[54] = temp[11];
            kint[55] = temp[3];

            //分组56位密钥为2部分
            for (int i = 0; i < 28; i++)
            {
                c0[i] = kint[i];
                d0[i] = kint[i + 28];
            }


            //循环左移1位
            for (int i = 1; i < 28; i++)
            {
                c1[i - 1] = c0[i];
                d1[i - 1] = d0[i];
            }
            c1[27] = c0[0];
            d1[27] = d0[0];

            //循环左移1位
            for (int i = 1; i < 28; i++)
            {
                c2[i - 1] = c1[i];
                d2[i - 1] = d1[i];
            }
            c2[27] = c1[0];
            d2[27] = d1[0];

            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c3[i - 2] = c2[i];
                d3[i - 2] = d2[i];
            }
            c3[26] = c2[0];
            c3[27] = c2[1];

            d3[26] = d2[0];
            d3[27] = d2[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c4[i - 2] = c3[i];
            }
            c4[26] = c3[0];
            c4[27] = c3[1];
            for (int i = 2; i < 28; i++)
            {
                d4[i - 2] = d3[i];
            }
            d4[26] = d3[0];
            d4[27] = d3[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c5[i - 2] = c4[i];
            }
            c5[26] = c4[0];
            c5[27] = c4[1];
            for (int i = 2; i < 28; i++)
            {
                d5[i - 2] = d4[i];
            }
            d5[26] = d4[0];
            d5[27] = d4[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c6[i - 2] = c5[i];
            }
            c6[26] = c5[0];
            c6[27] = c5[1];
            for (int i = 2; i < 28; i++)
            {
                d6[i - 2] = d5[i];
            }
            d6[26] = d5[0];
            d6[27] = d5[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c7[i - 2] = c6[i];
            }
            c7[26] = c6[0];
            c7[27] = c6[1];
            for (int i = 2; i < 28; i++)
            {
                d7[i - 2] = d6[i];
            }
            d7[26] = d6[0];
            d7[27] = d6[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c8[i - 2] = c7[i];
            }
            c8[26] = c7[0];
            c8[27] = c7[1];
            for (int i = 2; i < 28; i++)
            {
                d8[i - 2] = d7[i];
            }
            d8[26] = d7[0];
            d8[27] = d7[1];
            //循环左移1位
            for (int i = 1; i < 28; i++)
            {
                c9[i - 1] = c8[i];
            }
            c9[27] = c8[0];
            for (int i = 1; i < 28; i++)
            {
                d9[i - 1] = d8[i];
            }
            d9[27] = d8[0];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c10[i - 2] = c9[i];
            }
            c10[26] = c9[0];
            c10[27] = c9[1];
            for (int i = 2; i < 28; i++)
            {
                d10[i - 2] = d9[i];
            }
            d10[26] = d9[0];
            d10[27] = d9[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c11[i - 2] = c10[i];
            }
            c11[26] = c10[0];
            c11[27] = c10[1];
            for (int i = 2; i < 28; i++)
            {
                d11[i - 2] = d10[i];
            }
            d11[26] = d10[0];
            d11[27] = d10[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c12[i - 2] = c11[i];
            }
            c12[26] = c11[0];
            c12[27] = c11[1];
            for (int i = 2; i < 28; i++)
            {
                d12[i - 2] = d11[i];
            }
            d12[26] = d11[0];
            d12[27] = d11[1];
            //循环左移2位
            for (int i = 2; i < 28; i++)
            {
                c13[i - 2] = c12[i];
            }
            c13[26] = c12[0];
            c13[27] = c12[1];
            for (int i = 2; i < 28; i++)
            {
                d13[i - 2] = d12[i];
            }

⌨️ 快捷键说明

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