用c完成DES加密过程中的1轮的迭代变换过程

用c完成DES加密过程中的1轮的迭代变换过程,第1张

DES算法处理的数据对象是一组64比特的明文串.设该明文串为m=m1m2…m64 (mi=0或1).明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E.其加密过程图示如下:

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了

如果还有问题

给我发站内信


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12400151.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存