des.c
上传用户:sunzhixin
上传日期:2013-05-29
资源大小:17k
文件大小:10k
源码类别:

网格计算

开发平台:

Visual C++

  1. /*********************************************************************/
  2. /*-文件名:des.c  */
  3. /*-  */
  4. /*-功能: 实现DES加密算法的加密解密功能       */
  5. /*-  */
  6. /*-说明:des算法的实现代码  */
  7. /*- 能够实现56位或56*n密钥的des算法,可以通过该程序提供的接口    */
  8. /*- 进行数据的加密,保证数据在传送过程的安全性  */
  9. /*-  */
  10. /*-  */
  11. /*-该程序的所有权利由作者保留                  */
  12. /*-      */
  13. /*-      */
  14. /*-版本号:1.0.0(2002.4)  */
  15. /*-  */
  16. /*-  */
  17. /*-AUTHOR:吴真(WUZHEN)  */
  18. /*-  */
  19. /*********************************************************************/
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <memory.h>
  24. #include <malloc.h>
  25. #include "des.h"
  26. #define SUCCESS 0 
  27. #define FAIL -1
  28. #define READFILESIZE 512
  29. #define WZ_COMMEND_NUM 4
  30. #define WZUSEHELPNUM 19
  31. #define DESONE 1
  32. #define DESTHREE 2
  33. #define DESMULTI 3
  34. INT8 *WZ_Commend_Help[] =
  35. {
  36. "基于DES的加密解密工具v1.0  ",/*0*/
  37. "追求卓越,勇于创新  ",
  38. "----著者 :  吴真---  ",
  39. "     "
  40. };
  41. INT8 *WZ_USE_HELP[]={
  42. "输入5+n个参数:",
  43. "t1.可执行文件名 *.exe",
  44. "t2.操作类型 1:一层加密;2:一层解密;",
  45. "tt13:N层单密钥加密;23:N层单密钥解密;",
  46. "tt39:N层多密钥加密;49:N层多密钥解密",
  47. "t3.读出数据的文件名*.txt",
  48. "t4.写入数据的文件名*.txt",
  49. "t5.密钥(8字节例如:wuzhen12)",
  50. "t[6].N层单密钥的层数或者...二层加密|解密密钥",
  51. "t[7].三层加密|解密密钥",
  52. "t[8]. ...",
  53. "t[N].N层加密|解密密钥",
  54. "t 例1: des 1 1.txt 2.txt 12345678",
  55. "t    : des 2 2.txt 3.txt 12345678",
  56. "t 例2: des 13 1.txt 2.txt tiantian 5",
  57. "t    : des 23 2.txt 3.txt tiantian 5",
  58. "t 例3: des 39 1.txt 2.txt 12345678 tiantian gaoxinma",
  59. "t    : des 49 2.txt 3.txt 12345678 tiantian gaoxinma",
  60. "******************************"
  61. };
  62. INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length);/*以16进制写入文件*/
  63. INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len);/*16进制解码*/
  64. INT32 file_enc(FILE *readfile,FILE *writefile,
  65.    ULONG8 *key,ULONG32 keynum,
  66.    ULONG8 **superkey,ULONG32 n_superkey,
  67.    ULONG8 flag);
  68. INT32 file_dec(FILE *readfile,FILE *writefile,
  69.    ULONG8 *key,ULONG32 keynum,
  70.    ULONG8 **superkey,ULONG32 n_superkey,
  71.    ULONG8 flag);
  72. void wz_print_help();
  73. INT32 main(INT32 argc,INT8 *argv[])
  74. {
  75. INT8 *FILENAME1,*FILENAME2;    
  76. FILE *fp, *fp2;
  77. ULONG8 *key ;
  78. ULONG8 **superkey ;/*n层加密解密密钥*/
  79. ULONG8 n_superkey ;
  80. ULONG32 num;     
  81. if ( argc >= 5 && (atoi(argv[1]) == 39 || atoi(argv[1]) == 49 ) )
  82. {
  83. n_superkey = argc - 4 ;
  84. superkey = ( INT8 **)calloc(1, n_superkey*sizeof( void *) ) ;
  85. for ( num = 0 ; num < n_superkey ; num++)
  86. {
  87. superkey[num] = argv[4+num] ;
  88. }
  89. }
  90. else if ( argc == 6 && (atoi(argv[1]) == 13 || atoi(argv[1]) == 23 ) && (atoi(argv[5])) > 0)
  91. {
  92. }
  93. else if ( argc == 5 && ( atoi(argv[1]) == 1 || atoi(argv[1]) == 2 ))
  94. {
  95. }
  96. else
  97. {
  98. wz_print_help();
  99. return FAIL;
  100. }
  101. FILENAME1 = argv[2];
  102. FILENAME2 = argv[3];
  103. if ((fp= fopen(FILENAME1,"rb")) == NULL || (fp2 = fopen(FILENAME2,"wb"))==NULL)
  104. {
  105. printf("Can't open filen");
  106. return FAIL;
  107. }  
  108.     key = argv[4] ;
  109. switch( atoi(argv[1] ))
  110. {
  111. case 1: /*加密*/
  112. file_enc(fp,fp2,key,0, NULL,0, DESONE);
  113. printf("n tDES 一层加密完毕,密文存于%s文件n",FILENAME2);
  114. break;
  115. case 2:
  116. file_dec(fp,fp2,key,0, NULL, 0,DESONE);
  117. printf("n tDES 一层解密完毕,密文存于%s文件n",FILENAME2);
  118. break;
  119. case 13:
  120. file_enc(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);
  121. printf("n tDES %u层单密钥加密完毕,密文存于%s文件n",atoi(argv[5]),FILENAME2);
  122. break;
  123. case 23:
  124. file_dec(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);
  125. printf("n tDES %u层单密钥解密完毕,密文存于%s文件n",atoi(argv[5]),FILENAME2);
  126. break;
  127. case 39:
  128. file_enc(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);
  129. printf("n tDES 多密钥加密完毕,密文存于%s文件n",FILENAME2);
  130. free(superkey);
  131. superkey = NULL;
  132. break;
  133. case 49:
  134. file_dec(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);
  135. printf("n tDES 多密钥加密完毕,密文存于%s文件n",FILENAME2);
  136. free(superkey);
  137. superkey = NULL;
  138. break;
  139. default:
  140. printf("请选择是加密|解密 plese choose encrypt|deencryptn");
  141. break;
  142. }
  143. fclose(fp);
  144. fclose(fp2);
  145. return SUCCESS;
  146. }
  147. void wz_print_help()
  148. {
  149. INT32 i ;
  150. printf("t");
  151. for (  i = 0 ; i < 22 ; i++)
  152. {
  153. printf("%c ",5);
  154. }
  155. printf("n");
  156. for( i = 0 ; i < WZ_COMMEND_NUM ; i++)
  157. {
  158. printf("t%ct%s %cn",5,WZ_Commend_Help[i],5);
  159. }
  160. printf("t");
  161. for (  i = 0 ; i < 22 ; i++)
  162. {
  163. printf("%c ",5);
  164. }
  165. printf("n");
  166. for( i = 0 ; i < WZUSEHELPNUM ; i++)
  167. {
  168. printf("t%sn",WZ_USE_HELP[i]);
  169. }
  170. return ;
  171. }
  172. INT32 file_enc(FILE *readfile,FILE *writefile,
  173.    ULONG8 *key,ULONG32 keynum,
  174.    ULONG8 **superkey,ULONG32 n_superkey,
  175.    ULONG8 flag)
  176. {
  177. INT32 filelen = 0,readlen = 0,writelen = 0;
  178. ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/
  179. ULONG8 readbuf[READFILESIZE] = { 0 };
  180. filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );
  181. while( filelen == READFILESIZE )
  182. {
  183. totalfilelen += READFILESIZE;
  184. switch(flag)
  185. {
  186. case DESONE:
  187. des( readbuf,key,READFILESIZE);
  188. break;
  189. case DESTHREE:
  190. des3( readbuf, key ,keynum,READFILESIZE);
  191. break;
  192. case DESMULTI:
  193. desN( readbuf, superkey ,n_superkey,READFILESIZE);
  194. break;
  195. }
  196. hextofile( readbuf, writefile, READFILESIZE );/*以16进制形式写入文件*/
  197. memset(readbuf,0,READFILESIZE);
  198. filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );
  199. }
  200. /*这是从文件中读出的最后一批数据,长度可能会等于0,所以要先判断*/
  201. if ( filelen > 0 )
  202. {
  203. /*如果从文件中读出的长度不等于0,那么肯定有8个字节以上的空间
  204. 文件长度存在最后8个字节中*/
  205. totalfilelen += filelen;
  206. memcpy( &readbuf[READFILESIZE-8], (ULONG8*)&totalfilelen,4);
  207. switch(flag)
  208. {
  209. case DESONE:
  210. des( readbuf,key,READFILESIZE);
  211. break;
  212. case DESTHREE:
  213. des3( readbuf, key ,keynum,READFILESIZE);
  214. break;
  215. case DESMULTI:
  216. desN( readbuf, superkey ,n_superkey,READFILESIZE);
  217. break;
  218. }
  219. hextofile( readbuf, writefile,READFILESIZE );/*以16进制形式写入文件*/
  220. memset(readbuf,0 ,READFILESIZE);
  221. }
  222. else /*filelen == 0*/
  223. {
  224. memcpy( &readbuf[0], (ULONG8*)&totalfilelen,4);
  225. switch(flag)
  226. {
  227. case DESONE:
  228. des( readbuf,key,8);
  229. break;
  230. case DESTHREE:
  231. des3( readbuf, key ,keynum,8);
  232. break;
  233. case DESMULTI:
  234. desN( readbuf, superkey ,n_superkey,8);
  235. break;
  236. }
  237. hextofile( readbuf, writefile, 8);/*以16进制形式写入文件*/
  238. }
  239. return SUCCESS;
  240. }
  241. INT32 file_dec(FILE *readfile,FILE *writefile,
  242.    ULONG8 *key,ULONG32 keynum,
  243.    ULONG8 **superkey,ULONG32 n_superkey,
  244.    ULONG8 flag)
  245. {
  246. INT32 filelen = 0,readlen = 0,writelen = 0;
  247. ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/
  248. INT32 num = 0;
  249. ULONG8 readbuf[READFILESIZE] = { 0 };
  250. ULONG8 sendbuf[READFILESIZE*2] = { 0 };
  251. fseek(readfile,-16,SEEK_END);/*最后16个字节的表示文件长度的空间*/
  252. filelen = fread( sendbuf, sizeof( INT8 ), 16, readfile );
  253. encodehex( readbuf,sendbuf,8);
  254. switch(flag)
  255. {
  256. case DESONE:
  257. Ddes( readbuf,key,8);
  258. break;
  259. case DESTHREE:
  260. Ddes3( readbuf, key ,keynum,8);
  261. break;
  262. case DESMULTI:
  263. DdesN( readbuf, superkey ,n_superkey,8);
  264. break;
  265. }
  266. /*解密*/
  267. memcpy((ULONG8*)&totalfilelen, &readbuf[0],4);/*得到文件总长*/
  268. memset(readbuf,0 ,8);
  269. memset(sendbuf,0 ,16);
  270.     
  271. num = totalfilelen/READFILESIZE;/*有几个READFILESIZE组*/
  272. totalfilelen %= READFILESIZE;
  273. fseek(readfile,0,SEEK_SET);/*跳到文件头*/
  274. while(num--)
  275. {
  276. filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );
  277. encodehex( readbuf,sendbuf,READFILESIZE);
  278. switch(flag)
  279. {
  280. case DESONE:
  281. Ddes( readbuf,key,READFILESIZE);
  282. break;
  283. case DESTHREE:
  284. Ddes3( readbuf, key ,keynum,READFILESIZE);
  285. break;
  286. case DESMULTI:
  287. DdesN( readbuf, superkey ,n_superkey,READFILESIZE);
  288. break;
  289. }
  290. writelen = fwrite(readbuf, sizeof( INT8 ), READFILESIZE, writefile);   
  291. memset(readbuf,0 ,READFILESIZE);
  292. memset(sendbuf,0 ,READFILESIZE*2);
  293. }
  294. if ( totalfilelen > 0 )/*最后一块有多余的元素*/
  295. {
  296. filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );
  297. encodehex( readbuf,sendbuf,READFILESIZE);
  298. switch(flag)
  299. {
  300. case DESONE:
  301. Ddes( readbuf,key,READFILESIZE);
  302. break;
  303. case DESTHREE:
  304. Ddes3( readbuf, key ,keynum,READFILESIZE);
  305. break;
  306. case DESMULTI:
  307. DdesN( readbuf, superkey ,n_superkey,READFILESIZE);
  308. break;
  309. }
  310. writelen = fwrite(readbuf, sizeof( INT8 ), totalfilelen, writefile);
  311. memset(readbuf,0 ,READFILESIZE);
  312. memset(sendbuf,0 ,READFILESIZE*2);
  313. }
  314. return SUCCESS;
  315. }
  316. INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)
  317. {
  318. ULONG32 writelen = 0 ;
  319. /*以16进制形式写入文件*/
  320.     while( writelen < length)
  321. {
  322. if(buf[writelen] == 0)
  323. {
  324. fprintf( writefile, "%x", 0 );
  325. fprintf( writefile, "%x", 0 );
  326. }
  327. else if (buf[writelen] < 0x10)
  328. {
  329. fprintf( writefile, "%x", 0 );
  330. fprintf( writefile, "%x", buf[writelen] );
  331. }
  332. else
  333. {
  334. fprintf( writefile, "%x", buf[writelen] );
  335. }
  336. writelen++;
  337. }
  338. return SUCCESS;
  339. }
  340. INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len)
  341. {
  342. ULONG8 *readfirst = frombuf ;
  343. ULONG8 *readend = &frombuf[1] ;
  344. INT8 *s;
  345. ULONG8 y[2] ;     
  346. ULONG32 i;
  347. for ( i = 0 ; i < len ; i++)
  348. {
  349. y[0] = *readfirst ;
  350. y[1] = *readend ;
  351. readfirst += 2 ;
  352. readend += 2 ;
  353. tobuf[i] = (ULONG8)strtol((INT8*)y, &s, 16);
  354. }
  355. return SUCCESS;
  356. }