DES加密解密算法C语言代码实现

代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  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 int main()
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<Num;i++)
182  {
183   Data_out[i]=Data_in[i];
184  }
185
186 }
187 void Change_bit(bool * Data_out,int Num) //二进制的位置进行转换;
188 {
189  int i,j;
190  static bool Temp[8]={0};
191  for(i=0;i<Num/8;i++)
192  {
193   Bitcopy(Temp,Data_out,Num/8);
194   for(j=0;j<Num/8;j++)
195   {
196    Data_out[j]=Temp[Num/8-1-j];
197   }
198   Data_out+=Num/8;
199  }
200 }
201 void ByteToBit( bool * Data_out,char * Data_in,int Num) //字节转位
202 {
203  int i,j;
204  for(i=0;i<Num;i++)
205  {
206   Data_out[i]=(Data_in[i/8]>>(i%8))&0x01;
207  }
208  //Change_bit(Data_out,Num);
209 }
210 void BitToHex(char * Data_out, bool * Data_in,int Num) //二进制转十六进制
211 {
212  int i;
213  for(i=0;i<Num/4;i++)
214  {
215   Data_out[i]=0;
216  }
217  for(i=0;i<Num/4;i++)
218  {
219   Data_out[i]=Data_in[4*i]+Data_in[4*i+1]*2+Data_in[4*i+2]*4+Data_in[4*i+3]*8;
220   if(Data_out[i]%16>9)
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  int i;
231  for(i=0;i<Num;i++)
232  {
233   if(Data_in[i/4]<=‘9‘)
234   {
235    Data_out[i]=((Data_in[i/4]-‘0‘)>>(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<(Num/8);i++)
247  {
248   My_message[i]=0;
249  }
250  for(i=0;i<Num;i++)
251  {
252   My_message[i/8]|=Message_in[i]<<(i%8);
253  }
254 }
255 void TableReplace( bool *Data_out, bool * Data_in,const char *Table ,int Num) // 置换算法
256 {
257  int i=0;
258  static bool Temp[256]={0};
259  for(i=0;i<Num;i++)
260  {
261   Temp[i]=Data_in[Table[i]-1];
262  }
263  Bitcopy(Data_out,Temp,Num);
264 }
265 void Loop_bit(bool * Data_out,int movstep,int len)
266 {
267  static bool Temp[256]={0};
268  Bitcopy(Temp,Data_out,movstep);
269  Bitcopy(Data_out,Data_out+movstep,len-movstep);
270  Bitcopy(Data_out+len-movstep,Temp,movstep);
271  /*Temp=Data_out;
272  Temp[movstep]=‘\0‘;
273  Data_out=Data_out+movstep;
274  Data_out+(len-movstep)=Temp;*/
275 }
276 void Xor(bool * Message_out,bool * Message_in,int Num)//执行异或
277 {
278  int i;
279  for(i=0;i<Num;i++)
280  {
281   Message_out[i]=Message_out[i]^Message_in[i];
282  }
283 }
284 void SetKey(char My_key[8])
285 {
286  int i,j;
287  static bool Key_bit[64]={0}; //Key的二进制缓存;
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  int i;
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  int i;
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  int i;
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 }

原文地址:https://www.cnblogs.com/jikexianfeng/p/10192024.html

时间: 2024-10-10 01:46:05

DES加密解密算法C语言代码实现的相关文章

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

DES加密解密算法

DES加密解密算法 // 仿射变换加解密.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <conio.h> static char key[10], key_a[5], code[8], key_b[5], temp[10], key_aa[8], key_bb[8], l[4], r[4], l_a[4], r_a[4], V[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }, b[8]; char Code

javascript DES加密解密算法

原文:javascript DES加密解密算法 源代码下载地址:http://www.zuidaima.com/share/1550463672044544.htm javascript DES加密解密算法,java通过ScriptEngineManager调用的例子. 源码截图:

用JAVA实现的DES加密解密算法

package Encrypt; import java.security.*; import javax.crypto.*; import sun.misc.*; /** * 使用DES加密与解密,可对byte[],String类型进行加密与解密 * 密文可使用String,byte[]存储. * 方法: * void getKey(String strKey)从strKey的字条生成一个Key * String getEncString(String strMing)对strMing进行加密

android -------- DES加密解密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来.需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来. DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法

DES加密解密-&gt;java实现

DES加密解密涉及到的JAVA类 Cipher 此类为加密和解密提供密码功能.它构成了 Java Cryptographic Extension (JCE) 框架的核心. 为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它.还可以指定提供者的名称(可选). 转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作).转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案. 转换具有以

兼容PHP和Java的des加密解密代码分享

这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 php <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加

java/php DES/CBC/PKCS5Padding加密解密算法实现过程

先看java代码 Java代码   public static String encrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory k

des加密解密——java加密,php解密

最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混杂,好不容易测试在php这边测试加密和解密成功了.为确保安卓app端提交过来的加密参数能够解密出来,给定安卓人员一个字符串,让他们把des加密后的字符串给我,在php这边解密.结果一看,加密出来的字符串跟我这边加密出来的结果不一致,自然是解密不出来. 要来java的des算法代码,研究加密的过程,其