2016年大三上-网络安全-密码学-DES算法

来源:互联网 发布:淘宝怎么可以买到片 编辑:程序博客网 时间:2024/05/28 23:22

/* *Copyright (c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 *完成日期:2016年10月27日 *版本号:v1.0 * *问题描述:密码学-DES算法 *输入描述:64位密文和64位密钥 *输出描述:加密后的密文 */ #include <iostream>#include <math.h>using namespace std;int IP[]= {58,50,42,34,26,18,10,2,           60,52,44,36,28,20,12,4,           62,54,46,38,30,22,14,6,           64,56,48,40,32,24,16,8,           57,49,41,33,25,17,9,1,           59,51,43,35,27,19,11,3,           61,53,45,37,29,21,13,5,           63,55,47,39,31,23,15,7          };int IPE[]= {40,8,48,16,56,24,64,32,            39,7,47,15,55,23,63,31,            38,6,46,14,54,22,62,30,            37,5,45,13,53,21,61,29,            36,4,44,12,52,20,60,28,            35,3,43,11,51,19,59,27,            34,2,42,10,50,18,58,26,            33,1,41,9,49,17,57,25           };int PC_1[]= {57,49,41,33,25,17,9,             1,58,50,42,34,26,18,             10,2,59,51,43,35,27,             19,11,3,60,52,44,36,             63,55,47,39,31,23,15,             7,62,54,46,38,30,22,             14,6,61,53,45,37,29,             21,13,5,28,20,12,4            };int PC_2[]= {14,17,11,24,1,5,             3,28,15,6,21,10,             23,19,12,4,26,8,             16,7,27,20,13,2,             41,52,31,37,47,55,             30,40,51,45,33,48,             44,49,39,56,34,53,             46,42,50,36,29,32            };int E[]= {32,1,2,3,4,5,          4,5,6,7,8,9,          8,9,10,11,12,13,          12,13,14,15,16,17,          16,17,18,19,20,21,          20,21,22,23,24,25,          24,25,26,27,28,29,          28,29,30,31,32,1         };int P[]= {16,7,20,21,          29,12,28,17,          1,15,23,26,          5,18,31,10,          2,8,24,14,          32,27,3,9,          19,13,30,6,          22,11,4,25         };int Shift[]= {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};void ByteToBits(int x,char *D)                     //字节转比特{    char tmp[5];    int len=0;    while(x)    {        tmp[len++]=x%2+'0';        x/=2;    }    int num=0;    if(len<4)num=4-len;    int i;    for(i=0; i<num; ++i)D[i]='0';    for(int j=len-1; i<4; ++i,j--)D[i]=tmp[j];    D[4]='\0';}int BitsToByte(char *D,int n)                       //比特转字节{    int x,temp=n-1;    double s=0,m=0;    while(temp>=0)    {        x=D[temp--]-'0';        s+=x*pow(2,m++);    }    return s;}void myPermuation(char *In,char *Out,int *P,int n)  //通过置换表进行置换{    for(int i=0; i<n; ++i)    {        *(Out+i)=*(In+(*(P+i)-1));    }}void myXOR(char *In1,char *In2,int n,char *Out)     //字符串In1,In2异或,结果保存在字符串Out中{    for(int i=0; i<n; ++i)    {        if(In1[i]!=In2[i])            Out[i]='1';        else Out[i]='0';    }    Out[n]='\0';}void S_Box(char *In1,char *In2,char *Out)          //可以将S盒数据放在函数体内{    int S[8][4][16]= {{            14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,            0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,            4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,            15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13        },        {            15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,            3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,            0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,            13,8,10,1,3,15,4,2,11,6,7,12,10,5,14,9        },        {            10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,            13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,            13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,            1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12        },        {            7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,            13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,            10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,            3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14        },        {            2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,            14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,            4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,            11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3        },        {            12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,            10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,            9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,            4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13        },        {            4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,            13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,            1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,            6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12        },        {            13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,            1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,            7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,            2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11        }    };    int i,j,s=0;    char a[8][6],Out1[50],Out2[50],Out3[50];    myPermuation(In1,Out1,E,48);    myXOR(In2,Out1,48,Out2);    for(i=0; i<8; ++i)        for(j=0; j<6; ++j)            a[i][j]=Out2[i*6+j];    for(i=0; i<8; ++i)    {        int x,y,temp;        char b[4];        b[0]=a[i][0];        b[1]=a[i][5];        x=BitsToByte(b,2);        for(j=0; j<4; ++j)            b[j]=a[i][j+1];        y=BitsToByte(b,4);        temp=S[i][x][y];        ByteToBits(temp,b);        for(j=0; j<4; ++j)            Out3[s++]=b[j];    }    myPermuation(Out3,Out,P,32);}void myShift(char *In,char *Out,int n,int s)       //字符串循环左移{    int temp,i;    char a[100];    for(i=0; i<n; ++i)    {        a[i]=In[i];        a[i+n]=In[i];    }    temp=s%n;    for(i=0; i<n; ++i)        Out[i]=a[i+temp];    Out[i]='\0';}void StringCopy(char *a,char *b,int n)              //字符串复制{    int i;    for(i=0; i<n; ++i)    {        a[i]=b[i];    }}int main(){    int i,j;    char M_In[100]= {"0000000100100011010001010110011110001001101010111100110111101111"},M_Out[70],K_In[100]= {"0001001100110100010101110111100110011011101111001101111111110001"},K_Out[60];    myPermuation(M_In,M_Out,IP,64);    myPermuation(K_In,K_Out,PC_1,56);              //密文和密钥的初始置换    char L0[35],L1[35],R0[35],R1[35],C0[30],C1[30],D0[30],D1[30],Key_In[60],Key_Out[50];    for(i=0; i<32; ++i)    {        L0[i]=M_Out[i];        R0[i]=M_Out[i+32];    }    for(i=0; i<28; ++i)    {        C0[i]=K_Out[i];        D0[i]=K_Out[28+i];    }                                               //初始置换后的字符串左右半边的分离    for(i=0; i<16; ++i)                             //  进行16轮加密过程    {        myShift(C0,C1,28,Shift[i]);        myShift(D0,D1,28,Shift[i]);        for(j=0; j<28; ++j)        {            Key_In[j]=C1[j];            Key_In[j+28]=D1[j];        }        myPermuation(Key_In,Key_Out,PC_2,48);       //获取子密钥        StringCopy(L1,R0,32);        S_Box(R0,Key_Out,Key_In);        myXOR(L0,Key_In,32,R1);                     //左右半边子密文通过S盒进行轮函数加密        StringCopy(C0,C1,28);                       //参数复用        StringCopy(D0,D1,28);        StringCopy(L0,L1,32);        StringCopy(R0,R1,32);    }    for(i=0; i<32; ++i)    {        M_In[i]=R0[i];        M_In[i+32]=L0[i];    }    myPermuation(M_In,M_Out,IPE,64);                //最后一轮轮函数加密后通过置换表得到最后的加密结果。   for(i=0;i<64;++i)   {          if(i%8==0)           cout<<endl;          cout<<M_Out[i];   }    return 0;}

运行结果:


0 0
原创粉丝点击