DES算法加密过程
对DES算法加密过程图简禅示的说明如下:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如缺咐高伏尺下:
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
首先新建头文件des_encode.H内容碰高如下:
void EncodeMain() //EncodeMain function
void DecodeMain()//笑饥尺Sorry ,it has not used
void Decode(int *str,int *keychar) //decode :input 8 chars,8 keychars
void Encode(int *str,int *keychar) //encode: input 8 chars,8 keychars
void keyBuild(int *keychar)/肢镇/create key array
void StrtoBin(int *midkey,int *keychar) //change into binary
void keyCreate(int *midkey2,int movebit,int i)//call by keyBuild
void EncodeData(int *lData,int *rData,int *srt) //encodedata function
void F(int *rData,int *key) //F function
void Expand(int *rData,int *rDataP) //Expand function
void ExchangeS(int *rDataP,int *rData) //S-diagram change
void ExchangeP(int *rData) //P change
void FillBin(int *rData,int n,int s)// data to binarycall by S-Diagram change function
void DecodeData(int *str,int *lData,int *rData) //DecodeData from binary
int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,//initial change
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 IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,//opp initial change
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 s[][4][16]={{ //S-diagram array
{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,0,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 Ex[48]={ 32,1,2,3,4,5, //Expand array
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[32]={16,7,20,21,//P-change
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 PC1[56]={57,49,41,33,25,17,9,//PC-1 in keyBuild
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,33,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4
}
int PC2[48]={14,17,11,24,1,5, //PC-2 in keyBuild
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
}
再创建des.cpp
内容如下:
#include<stdio.h>
#include<string.h>
#include"des_encode.h"
int key[16][48]
char str[8]
void main() //main function
{
EncodeMain()
}
void EncodeMain() //EncodeMain function
{
int i
char keychar[8]
int key2[8]
int strkey[8]
printf("请输入8个要加密的字符:\n")
for(i=0i<8i++)
scanf("%c",&str[i])
getchar()
for(i=0i<8i++)
strkey[i]=str[i]
printf("\n输入明文的十六进制为:\n")
for(i=0i<8i++)
printf("%10x",strkey[i])
printf("\n请输入密钥(8个字符):\n")
for(i=0i<8i++)
scanf("%c",&keychar[i])
for(i=0i<8i++)
key2[i]=keychar[i]
getchar()
// printf("%c",keychar[i])
Encode(strkey,key2)
printf("\n加密后十六进制密文是:\n")
for(i=0i<8i++)
printf("%10x",strkey[i])
printf("\n\n清输入解密密码\n")
for(i=0i<8i++)
scanf("%c",&keychar[i])
for(i=0i<8i++)
key2[i]=keychar[i]
Decode(strkey,key2)
for(i=0i<8i++)
printf("%10x",strkey[i])
for(i=0i<8i++)
str[i]=strkey[i]
printf("\n明文为:\t")
for(i=0i<8i++)
printf("%c",str[i])
printf("\n\n")
}
void keyBuild(int *keychar){//create key array
int i,j
int movebit[]={1,1,2,2,2,2,2,2,
1,2,2,2,2,2,2,1}
int midkey2[56]
int midkey[64]
StrtoBin(midkey,keychar)
for(i=0i<56i++)
midkey2[i]=midkey[PC1[i]-1]
for(i=0i<16i++)
keyCreate(midkey2,movebit[i],i)
}
void StrtoBin(int *midkey,int *keychar){ //change into binary
int trans[8],i,j,k,n
n=0
for(i=0i<8i++){
j=0
while(keychar[i]!=0){
trans[j]=keychar[i]%2
keychar[i]=keychar[i]/2
j++
}
for(k=jk<8k++)trans[k]=0
for(k=0k<8k++)
midkey[n++]=trans[7-k]
}
}
void keyCreate(int *midkey2,int movebit,int n){
int i,temp[4]
temp[0]=midkey2[0]
temp[1]=midkey2[1]
temp[2]=midkey2[28]
temp[3]=midkey2[29]
if(movebit==2){
for(i=0i<26i++){
midkey2[i]=midkey2[i+2]
midkey2[i+28]=midkey2[i+30]
}
midkey2[26]=temp[0]midkey2[27]=temp[1]
midkey2[54]=temp[2]midkey2[55]=temp[3] }
else
{ for(i=0i<27i++){
midkey2[i]=midkey2[i+1]
midkey2[i+28]=midkey2[i+29]
}
midkey2[27]=temp[0]midkey2[55]=temp[2]
}
for(i=0i<48i++)
key[n][i]=midkey2[PC2[i]-1]
}
void EncodeData(int *lData,int *rData,int *str){ //encodedata function
int i,j,temp[8],lint,rint//int h
int data[64]
lint=0,rint=0
for(i=0i<4i++){
j=0
while(str[i]!=0){
temp[j]=str[i]%2
str[i]=str[i]/2
j++
}
while(j<8)temp[j++]=0
for(j=0j<8j++)
lData[lint++]=temp[7-j]
j=0
while(str[i+4]!=0){
temp[j]=str[i+4]%2
str[i+4]=str[i+4]/2
j++
}
while(j<8)temp[j++]=0
for(j=0j<8j++)rData[rint++]=temp[7-j]
}
for(i=0i<32i++){
data[i]=lData[i]
data[i+32]=rData[i]
}
for(i=0i<32i++){
lData[i]=data[IP1[i]-1]//printf("P1:%5d:%5d,%5d\n",IP1[i],lData[i],data[IP1[i]-1])
rData[i]=data[IP1[i+32]-1]
}
}
void F(int *rData,int *key){ //F function
int i,rDataP[48]
Expand(rData,rDataP)
for(i=0i<48i++){
rDataP[i]=rDataP[i]^key[i]// printf("%10d",rDataP[i])if((i+1)%6==0)printf("\n")
}
ExchangeS(rDataP,rData)
ExchangeP(rData)
}
void Expand(int *rData,int *rDataP){ //Expand function
int i
for(i=0i<48i++)
rDataP[i]=rData[Ex[i]-1]
}
void ExchangeS(int *rDataP,int *rData){ //S-diagram change
int i,n,linex,liney
linex=liney=0
for(i=0i<48i+=6){
n=i/6//printf("%10d\n",(rDataP[i]<<1))
linex=(rDataP[i]<<1)+rDataP[i+5]
liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4]
FillBin(rData,n,s[n][linex][liney])
}
}
void ExchangeP(int *rData){ //P change
int i,temp[32]
for(i=0i<32i++)
temp[i]=rData[i]
for(i=0i<32i++)
rData[i]=temp[P[i]-1]
}
void FillBin(int *rData,int n,int s){ // data to binarycall by S-Diagram change function
int temp[4],i
for(i=0i<4i++){
temp[i]=s%2
s=s/2
}
for(i=0i<4i++)
rData[n*4+i]=temp[3-i]
}
void DecodeData(int *str,int *lData,int *rData){//DecodeData from binary
int iint a,bint data[64]
a=0,b=0
for(i=0i<32i++){
data[i]=lData[i]
data[i+32]=rData[i]
}
for(i=0i<32i++){
lData[i]=data[IP2[i]-1]
rData[i]=data[IP2[i+32]-1]
}
for(i=0i<32i++){
a=(lData[i]&0x1)+(a<<1)
b=(rData[i]&0x1)+(b<<1)
if((i+1)%8==0){
str[i/8]=aa=0//printf("%d",i/8)
str[i/8+4]=bb=0//printf("%d",i/8+4)
}
}
}
void Encode(int *str,int *keychar){ //encode: input 8 chars,8 keychars
int lData[32],rData[32],temp[32],rDataP[48]
int i,j
keyBuild(keychar)
EncodeData(lData,rData,str)
for(i=0i<16i++){
for(j=0j<32j++)
temp[j]=rData[j]
F(rData,key[i])
for(j=0j<32j++){
rData[j]=rData[j]^lData[j]
}
for(j=0j<32j++)
lData[j]=temp[j]
}
DecodeData(str,rData,lData)
}
void Decode(int *str,int *keychar){ //decode :input 8 chars,8 keychars
int lData[32],rData[32],temp[32],rDataP[48]
int i,j
keyBuild(keychar)
EncodeData(lData,rData,str)//这个位置
for(i=0i<16i++){
for(j=0j<32j++)
temp[j]=rData[j]
F(rData,key[15-i])
for(j=0j<32j++){
rData[j]=rData[j]^lData[j]
}
for(j=0j<32j++){
lData[j]=temp[j]
}
}
DecodeData(str,rData,lData)
}
OK了
如果还有问题
给我发站内信
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)