java c语言 实现des算法_DES加密解密算法C语言代码实现

1 #include

2 #include

3 #include

4 /*------------------------5 定义枚举型全局变量6 ------------------------*/

7 typedef enum

8 {9 false = 0,10 true = 1

11 } bool;12

13 //十六轮子密钥

14 static bool SubKey[16][48]={0};15

16 /*---------------------*/

17 /*-------------------------------------------------------------18 各种置换表19 -------------------------------------------------------------*/

20 //IP置换表

21 const char IP_Table[64]={22 58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,23 62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,24 57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,25 61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7

26 };27 //IP-1置换表

28 const char IPR_Table[64]={29 40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,30 38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,31 36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,32 34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25

33 };34

35 //E扩展表

36 static char E_Table[48]={37 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,38 8, 9,10,11,12,13,12,13,14,15,16,17,39 16,17,18,19,20,21,20,21,22,23,24,25,40 24,25,26,27,28,29,28,29,30,31,32, 1

41 };42 //PC1置换表

43 static char PC1_Table[56]={44 57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,45 10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,46 63,55,47,39,31,23,15, 7,62,54,46,38,30,22,47 14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4

48 };49

50 //pc2表

51 static char PC2_Table[48]={52 14,17,11,24, 1, 5, 3,28,15, 6,21,10,53 23,19,12, 4,26, 8,16, 7,27,20,13, 2,54 41,52,31,37,47,55,30,40,51,34,33,48,55 44,49,39,56,34,53,46,42,50,36,29,32

56 };57 //移位表

58 static char Move_Table[16]={59 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1

60 };61 //S盒

62 static char S_Box[8][4][16]={63 //S1

64 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,65 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,66 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,67 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,68 //S2

69 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,70 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,71 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,72 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,73 //S3

74 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,75 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,76 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,77 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,78 //S4

79 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,80 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,81 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,82 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,83 //S5

84 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,85 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,86 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,87 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,88 //S6

89 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,90 10,15, 4, 2, 7,12, 0, 5, 6, 1,13,14, 0,11, 3, 8,91 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,92 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,93 //S7

94 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,95 13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6,96 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,97 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,98 //S8

99 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,100 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,101 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,102 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11

103 };104 //P置换表

105 static char P_Table[32]={106 16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,107 2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25

108 };109 /*-------------------------------------------------------------------*/

110

111 /*-----------------------------自定义函数-----------------------------*/

112 void SetKey(char My_key[8]); //生成16轮的子密钥;

113 void ByteToBit(bool * Data_out,char * Data_in,int Num); //字节转换成位;

114 void Change_bit(bool * Data_out,int Num);//二进制的位置进行转换;

115 void BitToByte(char My_message[8],bool * Message_in,int Num); //位转换成字节;

116 void TableReplace(bool *Data_out,bool *Data_in,const char *Table,int Num); //各种表的置换算法;

117 void Bitcopy(bool * Data_out,bool * Data_in,int Num); //二进制数组的拷贝

118 void Loop_bit(bool * Data_out,int movstep,int len); //左移位;

119 void Run_Des(char My_message[8],char HexMssage[16]);//des的轮加密算法

120 void Xor(bool * Message_out, bool * Message_in,int Num); //执行异或

121 void S_change(bool * Data_out, bool * Data_in); //S盒变换;

122 void HexToBit(bool * Data_out,char * Data_in,int Num); //十六进制转二进制

123 void BitToHex(char * Data_out,bool * Data_in,int Num); //二进制转换成十六进制;

124 void Run_desDes(char My_message[8],char HexMessage[16]);//DES轮解密算法;

125

126 /*--------------------------*/

127

128 /*--------------------------主函数----------------------------------*/

129 intmain()130 {131 int i=0,j;132 char My_key[8]={0}; //记录加密密钥;

133 char You_key[8]={0}; //解密密钥

134 char My_message[8]={0}; //明文

135 char Message_hex[16]={0};//16进制的密文

136 printf("请输入你要加密的内容(8 Byte):\n");137 gets(My_message);138 printf("请输入你的加密密钥:\n");139 gets(My_key);140 i=strlen(My_key);141 while(i!=8)142 {143 printf("请输入加密密钥(8 Byte)\n");144 gets(My_key);145 i=0;146 i=strlen(My_key);147 }148 SetKey(My_key); //生成16轮的加密子密钥;

149 Run_Des(My_message,Message_hex); //des的轮加密过程

150 printf("经过加密的密文为:\n");151 for(i=0;i<16;i++)152 {153 printf("%c",Message_hex[i]);154 }155 printf("\n");156 printf("请输入你的解密密钥(8 Byte):\n");157 gets(You_key);158 i=strlen(You_key);159 while(i!=8)160 {161 printf("请输入解密密钥(8 Byte)\n");162 gets(You_key);163 i=0;164 i=strlen(You_key);165 }166 SetKey(You_key); //生成16轮的解密子密钥;

167 Run_desDes(My_message,Message_hex);//解密;

168 printf("解密结果为:\n");169 for(i=0;i<8;i++)170 {171 printf("%c",My_message[i]);172 }173 printf("\n");174 return 0;175 }176

177 /*--------------------具体函数定义----------------------*/

178 void Bitcopy(bool * Data_out, bool * Data_in,int Num) //二进制数组拷贝

179 {180 int i=0;181 for(i=0;i

186 }187 void Change_bit(bool * Data_out,int Num) //二进制的位置进行转换;

188 {189 inti,j;190 static bool Temp[8]={0};191 for(i=0;i

202 {203 inti,j;204 for(i=0;i>(i%8))&0x01;207 }208 //Change_bit(Data_out,Num);

209 }210 void BitToHex(char * Data_out, bool * Data_in,int Num) //二进制转十六进制

211 {212 inti;213 for(i=0;i9)221 {222 Data_out[i]=Data_out[i]%16+'7';223 }224 else

225 Data_out[i]=Data_out[i]%16+'0';226 }227 }228 void HexToBit(bool * Data_out,char * Data_in,int Num) //十六进制转二进制

229 {230 inti;231 for(i=0;i>(i%4))&0x01;236 }237 else

238 {239 Data_out[i]=((Data_in[i/4]-'7')>>(i%4))&0x01;240 }241 }242 }243 void BitToByte(char My_message[8],bool * Message_in,int Num) //位转换成字节

244 {245 int i=0;246 for(i=0;i

256 {257 int i=0;258 static bool Temp[256]={0};259 for(i=0;i

275 }276 void Xor(bool * Message_out,bool * Message_in,int Num)//执行异或

277 {278 inti;279 for(i=0;i

288 static bool *Key_bit_L,*Key_bit_R;289 Key_bit_L=&Key_bit[0]; //key的左边28位;

290 Key_bit_R=&Key_bit[28]; //key的右边28位;

291 ByteToBit(Key_bit,My_key,64);292 /*Change_bit(Key_bit,64) ;//二进制的位置进行转换;293 for(i=0;i<64;i++)294 {295 printf("%d ",Key_bit[i]);296 }297 printf("\n");298 printf("\n");*/

299 TableReplace(Key_bit,Key_bit,PC1_Table,56);//pc-1 置换

300 for(i=0;i<16;i++)301 {302 Loop_bit(Key_bit_L,Move_Table[i],28);303 Loop_bit(Key_bit_R,Move_Table[i],28);304 TableReplace(SubKey[i],Key_bit,PC2_Table,48);//pc-2置换

305 }306 }307 void S_change(bool * Data_out, bool * Data_in) //S盒变换

308 {309 inti;310 int r=0,c=0;//S盒的行和列;

311 for(i=0;i<8;i++,Data_in=Data_in+6,Data_out=Data_out+4)312 {313 r=Data_in[0]*2+Data_in[5]*1;314 c=Data_in[1]*8+Data_in[2]*4+Data_in[3]*2+Data_in[4]*1;315 ByteToBit(Data_out,&S_Box[i][r][c],4);316 }317 }318 void F_change(bool Data_out[32],bool Data_in[48]) //f函数;

319 {320 inti;321 static bool Message_E[48]={0}; //存放E置换的结果;

322 TableReplace(Message_E,Data_out,E_Table,48);//E表置换

323 Xor(Message_E,Data_in,48);324 S_change(Data_out,Message_E); //S盒变换

325 TableReplace(Data_out,Data_out,P_Table,32); //P置换

326 }327 void Run_Des(char My_message[8],char HexMssage[16])//des轮加密算法;

328 {329 inti;330 static bool Message_bit[64]={0};331 static bool *Message_bit_L=&Message_bit[0],*Message_bit_R=&Message_bit[32];332 static bool Temp[32]={0};333 ByteToBit(Message_bit,My_message,64);334 /*Change_bit(Message_bit,64) ;//二进制的位置进行转换;335 for(i=0;i<64;i++)336 {337 printf("%d ",Message_bit[i]);338 }339 printf("\n");340 printf("\n");*/

341 TableReplace(Message_bit,Message_bit,IP_Table,64);342 for(i=0;i<16;i++)343 {344 Bitcopy(Temp,Message_bit_R,32);345 F_change(Message_bit_R,SubKey[i]);346 Xor(Message_bit_R,Message_bit_L,32);347 Bitcopy(Message_bit_L,Temp,32);348 }349 TableReplace(Message_bit,Message_bit,IPR_Table,64);350 BitToHex(HexMssage,Message_bit,64);//二进制转换成十六进制;

351 }352 void Run_desDes(char My_message[8],char HexMessage[16])//DES轮解密算法;

353 {354 int i=0;355 static bool Message_bit[64]={0};356 static bool * Message_bit_L=&Message_bit[0], * Message_bit_R=&Message_bit[32];357 static bool Temp[32]={0};358 HexToBit(Message_bit,HexMessage,64);359 TableReplace(Message_bit,Message_bit,IP_Table,64);360 for(i=15;i>=0;i--)361 {362 Bitcopy(Temp,Message_bit_L,32);363 F_change(Message_bit_L,SubKey[i]);364 Xor(Message_bit_L,Message_bit_R,32);365 Bitcopy(Message_bit_R,Temp,32);366 }367 TableReplace(Message_bit,Message_bit,IPR_Table,64);368 BitToByte(My_message,Message_bit,64);369 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值