?? des.h
字號:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*
author: 李云飛 yunnan university
*/
//定義ip置換表
int IP[64] = {
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
};
//定義ip逆置換表
int IP_1[64] = {
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
};
//定義e置換表
int E[48] = {
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
};
//定義p置換表
int P[32] = {
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
};
//定義pc1置換表
int PC1[56] = {
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
};
//定義pc2置換表
int PC2[] = {
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 LOOP[16] = {
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
//定義s盒
int S[8][4][16] = {
// S1
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,
// S2
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,
// S3
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,
// S4
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,
// S5
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,
// S6
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,
// S7
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,
// S8
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 change(char *w,int l)
{
int j=0,k=0;
int end=0,f;
for(k=(l-1),j=0 ; k>=0 ;j++,k--)
{
f=(int)pow(2,j);
end=end+(w[k]-'0')*f;
}
return end;
}
int getbit(int i,int *arg,unsigned long e1,unsigned long e2,int l)
{
unsigned long end1=e1,end2=e2;
int k=arg[i]; //得到替換表的數值
if (k>0 && k<=32) //因64位數是由兩個unsigned long型來存放的
{
end1=end1>>(l-k); //,所以在替換的時候要分成兩部分來處理
return (end1%2);
}
else if(k>32 && k<=64)
{
end2=end2>>(l-k+32);
return (end2%2);
}
else return -1;
}
int getb(int i,int l,unsigned int end)
{
unsigned int e=end;
e=e>>(l-i);
return (e%2);
}
int getb1(int i,int l,unsigned long end)
{
unsigned long e=end;
int k=l-i;
e=e>>k;
return (e%2);
}
unsigned long * getCharbit(char* s)
{
unsigned int a;
unsigned long e=0,*r;
int i,j,k,l,h,d;
r=(unsigned long*)malloc(2*sizeof(unsigned long));
for(h=0,d=0;h<2;h++){
for(l=0,j=32;l<4;l++,d++)
{
a=(unsigned int)s[d];
for(i=1;i<=8;i++,j--)
{
k=getb(i,8,a);
k=k<<(j-1);
e=e|k;
}
}
r[h]=e;
e=0;
}
return r;
}
void get56bit(unsigned long *n,unsigned long *e)
{
unsigned long e1=0,e2=0;
unsigned int i=0,k,h=24,l=32;
for(i=0;i<56;i++)
{
k=getbit(i,PC1, n[0],n[1],32);
if(i<24)
{
k=k<<(h-1);
e1=e1|k;
h--;
}
if(i>=24)
{
k=k<<(l-1);
e2=e2|k;
l--;
}
}
e[0]=e1; //e1存放的是前24位
e[1]=e2; //e2存放的是后32位
}
unsigned long * delevkey(unsigned long *e )
{
unsigned long *c,e1,e2;
unsigned int i,k,j,m=0;
c=(unsigned long *)malloc(2*sizeof(unsigned long));
if(!c){printf("malloc is wrong!(delevkey)"); exit(0);} //////////////////
c[0]=c[1]=0;
e1=e[0];
e2=e[1];
e1=e1<<4;
c[0]=c[0]|e1;
for(i=1,j=4;i<=4;i++,j--)//得到前28位
{
k=getb1(i,32,e2);
k=k<<(j-1);
c[0]=c[0]|k;
}
for(i=5,j=28;i<=32;i++,j--)//得到后28位
{
k=getb1(i,32,e[1]);
k=k<<(j-1);
c[1]=c[1]|k;
}
return c;
}
char * whbit(char *e,int l,int s)
{
char *a;
int i,j=s,h=l;
a=(char *)malloc(l*sizeof(char));
if(!a){printf("malloc is wrong!(whbit)"); exit(0);} //////////////////
for(i=0,h=h-j;i<j && h<l;i++,h++)
a[h]=e[i];
for(h=0;i<l;h++,i++)
a[h]=e[i];
return a;
}
char * changeInt(unsigned long m,int l)
{
unsigned long n=m;
int i,e;
char *a;
a=(char *)malloc(l*sizeof(char));
if(!a){printf("malloc is wrong!(changeInt)"); exit(0);} //////////////////
for(i=0;n!=1 && i<l;i++)
{
e=n%2;
a[i]=(char)(e+'0');
n=n/2 ;
}
a[i]=(char)n+'0';
a[i+1]='\0';
return a;
}
char * interger(unsigned long m,int l)
{
char *a,*b;
int i,j,k=0;
a=(char *)malloc(l*sizeof(char));
if(!a){printf("malloc is wrong!(interger)"); exit(0);} //////////////////
b=(char *)malloc(l*sizeof(char));
if(!b){printf("malloc is wrong!(interger)"); exit(0);} //////////////////
a=changeInt(m,l);
i=strlen(a);
if(i<l)
for(j=0;j<(l-i);j++)
b[j]='0';
else j=0;
for(i=(strlen(a)-1);i>=0 && k<l ;i-- ,j++,k++)
b[j]=a[i];
b[j]='\0';
return b;
}
char * together(char * c,char *d,int l)
{
char *e;
int i,j;
e=(char *)malloc((2*l)*sizeof(char));
if(!e){printf("malloc is wrong!(interger)"); exit(0);} //////////////////
strncpy(e, c, l);
for(i=l,j=0;i<2*l;i++,j++)
e[i]=d[j];
return e;
}
char *query(char *e,char *n)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -