找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2296|回复: 0
打印 上一主题 下一主题
收起左侧

DES加密C语言代码

[复制链接]
跳转到指定楼层
楼主
   des加密/解密源代码,代码写的比较清晰,欢迎大家参考!



C语言源程序如下:
  1. /*
  2. *********************************************************************************************************
  3. *                                     MICIRUM BOARD SUPPORT PACKAGE
  4. *
  5. *                            (c) Copyright 2007-2008; Micrium, Inc.; Weston, FL
  6. *
  7. *                   All rights reserved.  Protected by international copyright laws.
  8. *                   Knowledge of the source code may not be used to write a similar
  9. *                   product.  This file may only be used in accordance with a license
  10. *                   and should not be redistributed in any way.
  11. *********************************************************************************************************
  12. */

  13. /*
  14. *********************************************************************************************************
  15. *
  16. *                                              APPLICATION CODE
  17. *
  18. *                                                des_c.c
  19. *                                            with the
  20. *                                                           Y06 Board
  21. *
  22. * Filename      : des_c.c
  23. * Version       : V1.00
  24. * Programmer(s) : Felix
  25. *********************************************************************************************************
  26. */

  27. /*
  28. *********************************************************************************************************
  29. *                                             INCLUDE FILES
  30. *********************************************************************************************************
  31. */

  32. #define          DES_GLOBLAS
  33. #include        "des_h.h"

  34. /*
  35. *********************************************************************************************************
  36. *                                            LOCAL DEFINES
  37. *********************************************************************************************************
  38. */


  39. /*
  40. *********************************************************************************************************
  41. *                                           LOCAL CONSTANTS
  42. *********************************************************************************************************
  43. */


  44. /*
  45. *********************************************************************************************************
  46. *                                          LOCAL DATA TYPES
  47. *********************************************************************************************************
  48. */


  49. /*
  50. *********************************************************************************************************
  51. *                                            LOCAL TABLES
  52. *********************************************************************************************************
  53. */

  54. uc8 initial_tr[64] =
  55. {
  56.                 57, 49, 41, 33, 25, 17,  9,  1,
  57.                 59, 51, 43, 35, 27, 19, 11,  3,
  58.                 61, 53, 45, 37, 29, 21, 13,  5,
  59.                 63, 55, 47, 39, 31, 23, 15,  7,
  60.                 56, 48, 40, 32, 24, 16,  8,  0,
  61.                 58, 50, 42, 34, 26, 18, 10,  2,
  62.                 60, 52, 44, 36, 28, 20, 12,  4,
  63.                 62, 54, 46, 38, 30, 22, 14,  6
  64. };
  65. uc8 final_tr[64] =
  66. {
  67.                 39,  7, 47, 15, 55, 23, 63, 31,
  68.                 38,  6, 46, 14, 54, 22, 62, 30,
  69.                 37,  5, 45, 13, 53, 21, 61, 29,
  70.                 36,  4, 44, 12, 52, 20, 60, 28,
  71.                 35,  3, 43, 11, 51, 19, 59, 27,
  72.                 34,  2, 42, 10, 50, 18, 58, 26,
  73.                 33,  1, 41,  9, 49, 17, 57, 25,
  74.                 32,  0, 40,  8, 48, 16, 56, 24
  75. };
  76. uc8 swap[64] =
  77. {
  78.                 33, 34, 35, 36, 37, 38, 39, 40,
  79.                 41, 42, 43, 44, 45, 46, 47, 48,
  80.                 49, 50, 51, 52, 53, 54, 55, 56,
  81.                 57, 58, 59, 60, 61, 62, 63, 64,
  82.                 1,  2,  3,  4,  5,  6,  7,  8,
  83.                 9, 10, 11, 12, 13, 14, 15, 16,
  84.                 17, 18, 19, 20, 21, 22, 23, 24,
  85.                 25, 26, 27, 28, 29, 30, 31, 32
  86. };
  87. uc8 key_tr1[56] =
  88. {
  89.                 56, 48, 40, 32, 24, 16,  8,
  90.                 0, 57, 49, 41, 33, 25, 17,
  91.                 9,  1, 58, 50, 42, 34, 26,
  92.                 18, 10,  2, 59, 51, 43, 35,
  93.                 62, 54, 46, 38, 30, 22, 14,
  94.                 6, 61, 53, 45, 37, 29, 21,
  95.                 13,  5, 60, 52, 44, 36, 28,
  96.                 20, 12,  4, 27, 19, 11,  3
  97. };
  98. uc8 key_tr2[64] =
  99. {
  100.                 0,  0, 13,  4, 16, 10, 23,  0,
  101.                 0,  0,  2,  9, 27, 14,  5, 20,
  102.                 0,  0, 22,  7, 18, 11,  3, 25,
  103.                 0,  0, 15,  1,  6, 26, 19, 12,
  104.                 0,  0, 40, 54, 51, 30, 36, 46,
  105.                 0,  0, 29, 47, 39, 50, 44, 32,
  106.                 0,  0, 43, 52, 48, 38, 55, 33,
  107.                 0,  0, 45, 31, 41, 49, 35, 28
  108. };
  109. uc8 etr[64] =
  110. {
  111.                 0,  0, 31,  4,  0,  1,  2,  3,
  112.                 0,  0,  3,  8,  4,  5,  6,  7,
  113.                 0,  0,  7, 12,  8,  9, 10, 11,
  114.                 0,  0, 11, 16, 12, 13, 14, 15,
  115.                 0,  0, 15, 20, 16, 17, 18, 19,
  116.                 0,  0, 19, 24, 20, 21, 22, 23,
  117.                 0,  0, 23, 28, 24, 25, 26, 27,
  118.                 0,  0, 27,  0, 28, 29, 30, 31
  119. };
  120. uc8 ptr[32] =
  121. {
  122.                 31, 14, 39, 44, 60, 23, 55, 36,
  123.                 4, 30, 46, 53, 12, 37, 62, 21,
  124.                 5, 15, 47, 29, 63, 54,  6, 20,
  125.                 38, 28, 61, 13, 45, 22,  7, 52
  126. };
  127. uc8 s[8][64] =
  128. {
  129.                 {
  130.                                 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
  131.                                 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
  132.                                 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
  133.                                 15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13
  134.                 },
  135.                 {
  136.                                 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
  137.                                 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
  138.                                 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
  139.                                 13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9
  140.                 },
  141.                 {
  142.                                 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
  143.                                 13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
  144.                                 13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
  145.                                 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12
  146.                 },
  147.                 {
  148.                                 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
  149.                                 13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
  150.                                 10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
  151.                                 3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14
  152.                 },
  153.                 {
  154.                                 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
  155.                                 14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
  156.                                 4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
  157.                                 11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3
  158.                 },
  159.                 {
  160.                                 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
  161.                                 10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
  162.                                 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
  163.                                 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7, 6,  0,  8,  13
  164.                 },
  165.                 {
  166.                                 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
  167.                                 13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
  168.                                 1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
  169.                                 6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12
  170.                 },
  171.                 {
  172.                                 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
  173.                                 1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
  174.                                 7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
  175.                                 2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
  176.                 }
  177. };
  178. uc8 rots[16] =
  179. {
  180.                 1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1
  181. };
  182. uc8 bit_msk[8] =
  183. {
  184.                 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
  185. };

  186. /*
  187. *********************************************************************************************************
  188. *                                       LOCAL GLOBAL VARIABLES
  189. *********************************************************************************************************
  190. */

  191. static        u8 DES_Encrypt_key[]="u23djql3";
  192. static        u8 DES_Decrypt_key[]="u23djql3";
  193. static        u8 sub_keys[16][8]; //sub_keys[16][8]
  194. static        u8 main_key[8];

  195. /*
  196. *********************************************************************************************************
  197. *                                      LOCAL FUNCTION PROTOTYPES
  198. *********************************************************************************************************
  199. */

  200. static        void des(u8 *plain_strng, u8 *key, u8 d, u8 *ciph_strng);
  201. static        void transpose(u8 *idata, u8 *odata, uc8 *tbl, u8 n);
  202. static        void rotate_l(u8 *key);
  203. static        void compute_subkeys(u8 *key);
  204. static        void f(u8 *skey, u8 *a_str, u8 *x_str);

  205. static        void desEncrypt(u8 *plain_strng, u8 *key, u8 *ciph_strng);
  206. static        void desDecipher(u8 *plain_strng, u8 *key, u8 *ciph_strng);


  207. /*
  208. *********************************************************************************************************
  209. *                                     LOCAL CONFIGURATION ERRORS
  210. *********************************************************************************************************
  211. */

  212. /*
  213. ******************************************************************************
  214. * Function Name  : des
  215. * Description    :
  216. * Input          :
  217. *                                                                 :
  218. * Output         : None
  219. * Return         : None
  220. ******************************************************************************
  221. */
  222. static        void des(u8 *plain_strng, u8 *key, u8 d, u8 *ciph_strng)
  223. {
  224.                 u8 a_str[8], b_str[8], x_str[8];
  225.                 u8 i, j, *pkey, temp;
  226.                 for (i = 0; i < 8 ; ++i)
  227.                 {
  228.                                 if (key[i] != main_key[i])
  229.                                 {
  230.                                                 compute_subkeys(key);
  231.                                                 i = 7;
  232.                                 }
  233.                 }

  234.                 transpose(plain_strng, a_str, initial_tr, 64);
  235.                 for (i=1; i < 17; ++i)
  236.                 {
  237.                                 for (j=0; j < 8; ++j)
  238.                                 {
  239.                                                 b_str[j] = a_str[j];
  240.                                 }

  241.                                 if (!d)           /*enchipher*/
  242.                                                 pkey = &sub_keys[i-1][0];
  243.                                 else                /*dechipher*/
  244.                                                 pkey = &sub_keys[16-i][0];

  245.                                 for (j=0; j < 4; ++j)
  246.                                 {
  247.                                                 a_str[j] = b_str[j+4];
  248.                                 }

  249.                                 f(pkey, a_str, x_str);

  250.                                 for (j=0; j < 4; ++j)
  251.                                 {
  252.                                                 a_str[j+4] = b_str[j] ^ x_str[j];
  253.                                 }
  254.                 }

  255.                 temp = a_str[0]; a_str[0] = a_str[4]; a_str[4] = temp;
  256.                 temp = a_str[1]; a_str[1] = a_str[5]; a_str[5] = temp;
  257.                 temp = a_str[2]; a_str[2] = a_str[6]; a_str[6] = temp;
  258.                 temp = a_str[3]; a_str[3] = a_str[7]; a_str[7] = temp;
  259.                 transpose(a_str, ciph_strng, final_tr, 64);
  260. }
  261. /*
  262. ******************************************************************************
  263. * Function Name  : transpose
  264. * Description    :
  265. * Input          :
  266. *                                                                 :
  267. * Output         : None
  268. * Return         : None
  269. ******************************************************************************
  270. */
  271. static        void transpose(u8 *idata, u8 *odata, uc8 *tbl, u8 n)
  272. {
  273.                 uc8 *tab_adr;
  274.                 int i, bi_idx;
  275.                 tab_adr = &bit_msk[0];
  276.                 i = 0;

  277.                 do
  278.                 {
  279.                                 odata[i++] = 0;
  280.                 }
  281.                 while (i < 8);

  282.                 i = 0;
  283.                 do
  284.                 {
  285.                                 bi_idx = *tbl++;
  286.                                 if (idata[bi_idx>>3] & tab_adr[bi_idx & 7])
  287.                                 {
  288.                                                 odata[i>>3] |= tab_adr[i & 7];
  289.                                 }
  290.                 }
  291.                 while (++i < n);
  292. }
  293. /*
  294. ******************************************************************************
  295. * Function Name  : rotate_l
  296. * Description    :
  297. * Input          :
  298. *                                                                 :
  299. * Output         : None
  300. * Return         : None
  301. ******************************************************************************
  302. */
  303. static        void rotate_l(u8 *key)
  304. {
  305.                 u8 str_x[8];
  306.                 u8 i;
  307.                 for (i=0; i < 8; ++i)
  308.                                 str_x[i] = key[i];
  309.        
  310.                 for (i=0; i < 7; ++i)
  311.                 {
  312.                                 key[i] = (key[i] << 1);
  313.                                 if ((i < 6) && ((str_x[i+1] & 128) == 128))
  314.                                 key[i] |= 1;
  315.                 }
  316.                 if (str_x[0] & 0x80 )
  317.                                 key[3] |= 0x10;
  318.                 else
  319.                                 key[3] &= ~0x10;
  320.                
  321.                 if (str_x[3] & 0x08 )
  322.                                 key[6] |= 0x01;
  323.                 else
  324.                                 key[6] &= ~0x01;
  325. }
  326. /*
  327. ******************************************************************************
  328. * Function Name  : compute_subkeys
  329. * Description    :
  330. * Input          :
  331. *                                                                 :
  332. * Output         : None
  333. * Return         : None
  334. ******************************************************************************
  335. */
  336. static        void compute_subkeys(u8 *key)
  337. {
  338.                 u8 i, j, ikey[8], okey[8];
  339.                 for (i=0; i < 8; ++i)
  340.                 {
  341.                                 main_key[i] = key[i];
  342.                 }

  343.                 transpose(key, ikey, key_tr1, 56);

  344.                 for (i=0; i < 16; ++i)
  345.                 {
  346.                                 for (j=0; j < rots[i]; ++j)
  347.                                 {
  348.                                                 rotate_l(ikey);
  349.                                 }
  350.                                 transpose(ikey, okey, key_tr2,  64);
  351.                                 for (j=0; j < 8; ++j)
  352.                                 {
  353.                                                 sub_keys[i][j] = okey[j];
  354.                                 }
  355.                 }
  356. }

  357. /*
  358. ******************************************************************************
  359. * Function Name  : f
  360. * Description    :
  361. * Input          :
  362. *                                                                 :
  363. * Output         : None
  364. * Return         : None
  365. ******************************************************************************
  366. */
  367. static        void f(u8 *skey, u8 *a_str, u8 *x_str)
  368. {
  369.                 u8 e_str[8], y_str[8], z_str[8];
  370.                 u8 k;
  371.                 transpose(a_str, e_str, etr, 64);
  372.                 for (k=0; k < 8; ++k)
  373.                 {
  374.                                 y_str[k] = (e_str[k] ^ skey[k]) & 63;
  375.                                 z_str[k] = s[k] [y_str[k]];
  376.                 }
  377.                 transpose(z_str, x_str, ptr, 32);
  378. }
  379. /*
  380. ******************************************************************************
  381. * Function Name  : desEncrypt
  382. * Description    :
  383. * Input          :
  384. *                                                                 :
  385. * Output         : None
  386. * Return         : None
  387. ******************************************************************************
  388. */
  389. static        void desEncrypt(u8 *plain_strng, u8 *key, u8 *ciph_strng)
  390. {
  391.                 des(plain_strng,key,0, ciph_strng);
  392. }
  393. /*
  394. ******************************************************************************
  395. * Function Name  : desDecipher
  396. * Description    :
  397. * Input          :
  398. *                                                                 :
  399. * Output         : None
  400. * Return         : None
  401. ******************************************************************************
  402. */
  403. static        void desDecipher(u8 *plain_strng, u8 *key, u8 *ciph_strng)
  404. {
  405.                 des(plain_strng,key,1, ciph_strng);
  406. }

  407. /*
  408. ******************************************************************************
  409. * Function Name  : desEncryptPro
  410. * Description    : 加密函数
  411. * Input          :
  412. *                                                                 :
  413. * Output         : None
  414. * Return         : None
  415. ******************************************************************************
  416. */
  417. s8        desEncryptPro(u8 *pSrc,        u16 srcLen,        u8 *pOut,        u16 *outLen)
  418. {
  419.                 u8        loops=0,i=0;
  420.                 if((srcLen != 0) && (srcLen % 8 == 0))
  421.                 {
  422.                                 loops = srcLen / 8;
  423.                                 for(i=0;        i<loops;        i++)
  424.                                 {
  425.                                                 desEncrypt((pSrc+i*8), (u8 *)DES_Encrypt_key, (pOut+i*8));
  426.                                                 *outLen +=8;
  427.                                 }
  428.                                 return 0;
  429.                 }
  430.                 else
  431.                                 return -1;
  432. }
  433. /*
  434. ******************************************************************************
  435. * Function Name  : desEncryptPro
  436. * Description    : 解密函数
  437. * Input          :
  438. *                                                                 :
  439. * Output         : None
  440. * Return         : None
  441. ******************************************************************************
  442. */
  443. s8        desDecipherPro(u8 *pSrc,        u16 srcLen,        u8 *pOut,        u16 *outLen)
  444. {
  445.                 u8        loops=0,i=0;
  446.                 if((srcLen != 0) && (srcLen % 8 == 0))
  447.                 {
  448.                                 loops = srcLen / 8;
  449.                                 for(i=0;        i<loops;        i++)
  450.                                 {
  451.                                                 desDecipher((pSrc+i*8), (u8 *)DES_Decrypt_key, (pOut+i*8));
  452.                                                 *outLen +=8;
  453.                                 }
  454.                                 return 0;
  455.                 }
  456.                 else
  457.                                 return -1;
  458. }

  459. /*****************************************end*********************************************************/
复制代码

所有资料51hei提供下载:
des.zip (4.03 KB, 下载次数: 17)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表