DES加密算法的实现

来源:互联网 发布:mac重复照片清理软件 编辑:程序博客网 时间:2024/06/04 23:24

原理这里就不介绍了,只贴出代码。实现的代码是64位加密的DES程序。

1.加密函数f的实现函数:

int *function(int a[],int son[]){    int len_e=sizeof(e)/sizeof(e[0]);    int k,i,x,y;    int *res,mid[48],*ans;    int ss[8][4][16],*temp,tempv;    res=(int *)malloc(sizeof(int)*32);    ans=(int *)malloc(sizeof(int)*32);    for(k=0;k<len_e;k++)    {        mid[k]=a[e[k]-1];        mid[k]=mid[k] ^ son[k];    }    for(k=0;k<4;k++)    {        for(i=0;i<16;i++)        {            ss[0][k][i]=s1[k][i];            ss[1][k][i]=s2[k][i];            ss[2][k][i]=s3[k][i];            ss[3][k][i]=s4[k][i];            ss[4][k][i]=s5[k][i];            ss[5][k][i]=s6[k][i];            ss[6][k][i]=s7[k][i];            ss[7][k][i]=s8[k][i];        }    }    for(k=0;k<8;k++)    {        x=mid[6*k+1]*8+mid[6*k+2]*4+mid[6*k+3]*2+mid[6*k+4];        y=mid[6*k]*2+mid[6*k+5];        tempv=ss[k][y][x];        temp=dec2bin(tempv);        for(i=0;i<4;i++)        {            res[k*4+i]=temp[i];        }    }    for(k=0;k<32;k++)    {        ans[k]=res[p[k]-1];    }    return ans;}

2.产生子密钥函数:

int *produce_key(int fkey[]){    int *res;    int *c,*d,*c_d;    int i,k;    int len1=sizeof(rep1_c)/sizeof(rep1_c[0]);    int len2=sizeof(rep2)/sizeof(rep2[0]);    res=(int *)malloc(16*48*sizeof(int));    c=(int *)malloc(len1*sizeof(int));    d=(int *)malloc(len1*sizeof(int));    c_d=(int *)malloc(2*len1*sizeof(int));    for(k=0;k<len1;k++)    {        c[k]=fkey[rep1_c[k]-1];        d[k]=fkey[rep1_d[k]-1];    }    printf("\n");    int *ctemp,*dtemp;    for(k=0;k<16;k++)    {        ctemp=shift_left(c,len1,shift[k]);//循环左移的函数        dtemp=shift_left(d,len1,shift[k]);        for(i=0;i<len1;i++)        {            c[i]=ctemp[i];            d[i]=dtemp[i];            c_d[i]=ctemp[i];            c_d[i+len1]=dtemp[i];        }        for(i=0;i<len2;i++)        {            res[i+k*48]=c_d[rep2[i]-1];        }    }    return res;}

最终完整的C语言文件:

#include <stdlib.h>#include <math.h>#include <time.h>int text[64]={0};int key[64]={0};int *son_key;int shift[]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};int rep1_c[]={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};int rep1_d[]={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 rep2[]={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 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 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 ip_in[]={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 s1[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}};int s2[4][16]={{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,0,5,14,9}};int s3[4][16]={{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}};int s4[4][16]={{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}};int s5[4][16]={{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}};int s6[4][16]={{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}};int s7[4][16]={{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}};int s8[4][16]={{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 *shift_left(int array[],int length,int len){    int *res,i;    res=(int *)malloc(length*sizeof(int));    for(i=0;i<length-len;i++)    {        res[i]=array[i+len];    }    for(i=length-len;i<length;i++)    {        res[i]=array[i+len-length];    }    return res;}int *produce_key(int fkey[]){    int *res;    int *c,*d,*c_d;    int i,k;    int len1=sizeof(rep1_c)/sizeof(rep1_c[0]);    int len2=sizeof(rep2)/sizeof(rep2[0]);    res=(int *)malloc(16*48*sizeof(int));    c=(int *)malloc(len1*sizeof(int));    d=(int *)malloc(len1*sizeof(int));    c_d=(int *)malloc(2*len1*sizeof(int));    for(k=0;k<len1;k++)    {        c[k]=fkey[rep1_c[k]-1];        d[k]=fkey[rep1_d[k]-1];    }    printf("\n");    int *ctemp,*dtemp;    for(k=0;k<16;k++)    {        ctemp=shift_left(c,len1,shift[k]);        dtemp=shift_left(d,len1,shift[k]);        for(i=0;i<len1;i++)        {            c[i]=ctemp[i];            d[i]=dtemp[i];            c_d[i]=ctemp[i];            c_d[i+len1]=dtemp[i];        }        for(i=0;i<len2;i++)        {            res[i+k*48]=c_d[rep2[i]-1];        }    }    return res;}int *dec2bin(int num){    int *res,i=0;    int up=log(num)/log(2)+1;    res=(int*)malloc(sizeof(int)*4);    for(i=0;i<4;i++)    {        res[3-i]=num%2;        num=num/2;    }    return res;}int *function(int a[],int son[]){    int len_e=sizeof(e)/sizeof(e[0]);    int k,i,x,y;    int *res,mid[48],*ans;    int ss[8][4][16],*temp,tempv;    res=(int *)malloc(sizeof(int)*32);    ans=(int *)malloc(sizeof(int)*32);    for(k=0;k<len_e;k++)    {        mid[k]=a[e[k]-1];        mid[k]=mid[k] ^ son[k];    }    for(k=0;k<4;k++)    {        for(i=0;i<16;i++)        {            ss[0][k][i]=s1[k][i];            ss[1][k][i]=s2[k][i];            ss[2][k][i]=s3[k][i];            ss[3][k][i]=s4[k][i];            ss[4][k][i]=s5[k][i];            ss[5][k][i]=s6[k][i];            ss[6][k][i]=s7[k][i];            ss[7][k][i]=s8[k][i];        }    }    for(k=0;k<8;k++)    {        x=mid[6*k+1]*8+mid[6*k+2]*4+mid[6*k+3]*2+mid[6*k+4];        y=mid[6*k]*2+mid[6*k+5];        tempv=ss[k][y][x];        temp=dec2bin(tempv);        for(i=0;i<4;i++)        {            res[k*4+i]=temp[i];        }    }    for(k=0;k<32;k++)    {        ans[k]=res[p[k]-1];    }    return ans;}int *encrypt(int te[],int ke[]){    int l[32],r[32],tex[64],son[48],temp[32],*res,*ans;    ans=(int*)malloc(sizeof(int)*64);    res=(int*)malloc(sizeof(int)*32);    int i,k;    for(i=0;i<32;i++)    {        l[i]=te[ip[i]-1];        r[i]=te[ip[i+32]-1];    }    for(i=0;i<16;i++)    {        for(k=0;k<48;k++)        {            son[k]=son_key[i*48+k];        }        res=function(r,son);        for(k=0;k<32;k++)        {            temp[k]=r[k];            r[k]=l[k] ^ res[k];            l[k]=temp[k];        }    }    for(k=0;k<32;k++)    {        tex[k]=r[k];        tex[32+k]=l[k];    }    for(k=0;k<64;k++)    {        ans[k]=tex[ip_in[k]-1];    }    return ans;}int main(){    int t1=clock();    char text1[65]="0011000000110001001100100011001100110100001101010011011000110111";    char key1[65]="0011000100110010001100110011010000110101001101100011011100111000";    int i,k;    for(i=0;i<64;i++)    {        text[i]=(int)text1[i]-48;        key[i]=(int)key1[i]-48;    }    printf("明文:");    for(i=0;i<64;i++)    {        printf("%d",text[i]);        if((i+1)%8==0)        printf(" ");    }    printf("\n\n密钥:");    for(i=0;i<64;i++)    {        printf("%d",key[i]);        if((i+1)%8==0)        printf(" ");    }    printf("\n");    son_key=(int *)malloc(16*48*sizeof(int));    son_key=produce_key(key);    for(i=0;i<16;i++)    {        printf("子密钥 K%2d:",i+1);        for(k=0;k<48;k++)        {            printf("%d",son_key[48*i+k]);            if((k+1)%8==0)        printf(" ");        }        printf("\n");    }    int *new_text;    new_text=encrypt(text,key);    printf("\n密文:");     for(k=0;k<64;k++)    {        printf("%d",new_text[k]);        if((k+1)%8==0)        printf(" ");    }    int t2=clock()-t1;    printf("\n加密时间为:%dms",t2);    return 0;}
原创粉丝点击