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;}
阅读全文
0 0
- DES加密算法的实现
- DES加密算法的实现
- DES 加密算法的实现
- DES加密算法的实现
- DES加密算法的实现
- DES加密算法的源码实现
- DES加密算法的java实现
- DES加密算法的C++实现
- des对称加密算法的实现
- DES加密算法的C++实现
- DES加密算法的C++实现
- DES加密算法的一种简单实现
- c#下DES加密算法的实现
- DES加密算法在C#下的实现
- DES加密算法在C#下的实现
- DES加密算法在C#下的实现
- DES加密算法在C#下的实现
- DES加密算法的C语言实现
- eclipse 一些实用快捷键
- 51汇编指令集详解
- EASYUI DATAGRID 多列复选框CheckBox
- java编译中的$.class文件内容
- Android-25种开源炫酷动画框架
- DES加密算法的实现
- Android7.0新特性Jack server
- fork()创建子进程步骤、函数用法及常见考点(内附fork()过程图)
- 面向对象三大基本特性
- 如何启动或关闭oracle的归档(ARCHIVELOG)模式
- mybatis 3.4.5 常用配置标签 02
- linux FTP 创建用户
- DOS/UNIX回车符解密
- 使用activeMQ发送短信验证码