免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6541 | 回复: 5
打印 上一主题 下一主题

[算法] 求助:如何用C++ builder实现DES加密解密算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-27 15:53 |只看该作者 |倒序浏览
如何用C++ Builder或者ASP实现DES加密/解密算法,请各位大虾帮帮忙,十分感谢!~

论坛徽章:
0
2 [报告]
发表于 2006-02-28 20:30 |只看该作者
给你来个现成的。


  1. typedef        unsigned char byte;

  2. void Des_Bit2Byte(byte *, byte *);
  3. void Des_Byte2Bit(byte *, byte *);
  4. void Des_DesEncry(byte *, byte *);
  5. void Des_DesDecry(byte *, byte *);
  6. void Des_TransPose(byte *, byte *, int);
  7. void Des_Process(int, byte *, byte *, byte *, byte);
  8. void Des_Lshift(byte *, byte);
  9. void Des_Rshift(byte *, byte);

  10. unsigned char Des_Table0[] = {
  11.           58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,
  12.           62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,
  13.           57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,
  14.           61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7};
  15. unsigned char Des_Table1[] = {
  16.           57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,
  17.           59,51,43,35,27,19,11, 3,60,52,44,36,63,55,47,39,
  18.           31,23,15, 7,62,54,46,38,30,22,14, 6,61,53,45,37,
  19.           29,21,13, 5,28,20,12, 4};
  20. unsigned char Des_Table2[] = {
  21.           14,17,11,24, 1, 5, 3,28,15, 6,21,10,23,19,12, 4,
  22.           26, 8,16, 7,27,20,13, 2,41,52,31,37,47,55,30,40,
  23.           51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};
  24. unsigned char Des_Table3[] = {
  25.           40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
  26.           38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
  27.           36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
  28.           34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25};
  29. unsigned char Des_Table4[] = {
  30.           32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,10,11,
  31.           12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,
  32.           22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1};
  33. unsigned char Des_Table5[] = {
  34.           1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
  35. unsigned char Des_Table6[] = {
  36.           0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
  37. unsigned char Des_Table7[] = {
  38.           16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
  39.           2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25};
  40. unsigned char Des_Table8[][64] = {
  41.          {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
  42.           0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
  43.           4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
  44.           15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13},
  45.          {15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
  46.           3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
  47.           0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
  48.           13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9},
  49.          {10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
  50.           13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
  51.           13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
  52.           1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12},
  53.          {7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
  54.           13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
  55.           10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
  56.            3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14},
  57.          {2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
  58.            14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
  59.            4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
  60.            11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3},
  61.          {12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
  62.           10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
  63.           9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
  64.           4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13},
  65.          {4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
  66.           13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
  67.           1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
  68.           6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12},
  69.          {13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
  70.           1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
  71.           7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
  72.           2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11}};

  73. /*
  74. 函数功能:根据指定的密钥进行加密,将密文填回原始的字符
  75. 传入参数:
  76.   data : 原始的字符
  77.   key  : 密钥
  78. 返回参数:
  79. */
  80. void DES_Encode(unsigned char * data, unsigned char * key)
  81. {
  82. byte data_text[64], key_text[64];

  83.   Des_Bit2Byte(data, data_text);
  84.   Des_Bit2Byte(key, key_text);
  85.   Des_DesDecry(data_text, key_text);
  86.   Des_Byte2Bit(data_text, data);
  87.   return;
  88. }

  89. void DES_Encode(unsigned char * pdata,int length, unsigned char * key)
  90. {
  91. int id;

  92.   for(id=0;id<length/8;id++)
  93.     DES_Encode(pdata+id*8,key);
  94.   return;
  95. }

  96. /*
  97. 函数功能:根据指定的密钥解密密文,将原始的字符填传回到密文对应的地址
  98. 传入参数:
  99.   data : 密文
  100.   key  : 密钥
  101. 返回参数:
  102. */
  103. void DES_Decode(unsigned char * data, unsigned char * key)
  104. {
  105. byte data_text[64], key_text[64];

  106.   Des_Bit2Byte(data, data_text);
  107.   Des_Bit2Byte(key, key_text);
  108.   Des_DesEncry(data_text, key_text);
  109.   Des_Byte2Bit(data_text, data);
  110.   return;
  111. }

  112. void DES_Decode(unsigned char * pdata, int length,unsigned char * key)
  113. {
  114. int id;

  115.   for(id=0;id<length/8;id++)
  116.     DES_Decode(pdata+8*id,key);
  117.   return;
  118. }

  119. void Des_Bit2Byte(byte *text1, byte *text2)
  120. {
  121. int  i_temp1, i_temp2;
  122. byte mask, c_temp1;

  123.   for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  124.   {
  125.     c_temp1 = text1[i_temp1];
  126.     mask = 0x80;
  127.     for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
  128.     {
  129.       if (c_temp1 & mask)
  130.               text2[i_temp1 * 8 + i_temp2] = 1;
  131.       else
  132.               text2[i_temp1 * 8 + i_temp2] = 0;
  133.       mask >>= 1;
  134.     }
  135.   };
  136.   return;
  137. }

  138. void Des_Byte2Bit(byte *text1, byte *text2)
  139. {
  140. int  i_temp1, i_temp2;
  141. byte mask;

  142.   memset(text2, 0, 8);
  143.   for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  144.   {
  145.     mask = 0x80;
  146.     for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
  147.     {
  148.       if (text1[i_temp1 * 8 + i_temp2])
  149.               text2[i_temp1] |= mask;
  150.       mask >>= 1;
  151.     }
  152.   }
  153.   return;
  154. }

  155. void Des_DesEncry(byte *text1, byte *key)
  156. {
  157. byte c_temp1[64], c_temp2[32];
  158. int  i_temp1, i_temp2;

  159.   Des_TransPose(text1, Des_Table0, 64);
  160.   Des_TransPose(key, Des_Table1, 56);
  161.   for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
  162.   {
  163.     memcpy(c_temp1, text1+32, 32);
  164.     Des_Process(i_temp1, key, c_temp1, c_temp2, 'L');
  165.     for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
  166.       if (text1[i_temp2] == c_temp2[i_temp2])
  167.         c_temp1[i_temp2 + 32] = 0;
  168.       else
  169.               c_temp1[i_temp2 + 32] = 1;
  170.     memcpy(text1, c_temp1, 64);
  171.   }
  172.   memcpy(text1, c_temp1+32, 32);
  173.   memcpy(text1+32, c_temp1, 32);
  174.   Des_TransPose(text1, Des_Table3, 64);
  175.   return;
  176. }

  177. void Des_DesDecry(byte *text1, byte *key)
  178. {
  179. byte c_temp1[64], c_temp2[32];
  180. int  i_temp1, i_temp2;

  181.   Des_TransPose(text1, Des_Table0, 64);
  182.   memcpy(c_temp2, text1+32, 32);
  183.   memcpy(text1+32, text1, 32);
  184.   memcpy(text1, c_temp2, 32);
  185.   Des_TransPose(key, Des_Table1, 56);
  186.   for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
  187.   {
  188.     memcpy(c_temp1 + 32, text1, 32);
  189.     Des_Process(i_temp1, key, c_temp1 + 32, c_temp2, 'R');
  190.     for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
  191.       if (text1[i_temp2 + 32] == c_temp2[i_temp2])
  192.               c_temp1[i_temp2] = 0;
  193.       else
  194.               c_temp1[i_temp2] = 1;
  195.     memcpy(text1, c_temp1, 64);
  196.   }
  197.   Des_TransPose(text1, Des_Table3, 64);
  198.   return;
  199. }

  200. void Des_TransPose(byte *text, byte *table, int index)
  201. {
  202. byte c_temp1[64];
  203. int  i_temp1;

  204.   memcpy(c_temp1, text, 64);
  205.   for (i_temp1 = 0; i_temp1 < index; i_temp1++)
  206.     text[i_temp1] = c_temp1[table[i_temp1] - 1];
  207.   return;
  208. }

  209. void Des_Process(int i, byte *key, byte *R32, byte *PB, byte flag)
  210. {
  211. byte extr32[48], extkey[56], c_temp1;
  212. int  i_temp1;

  213.   memcpy(extr32, R32, 32);
  214.   Des_TransPose(extr32, Des_Table4, 48);

  215.   if (toupper(flag) == 'L')
  216.     Des_Lshift(key, Des_Table5[i]);
  217.   else
  218.     Des_Rshift(key, Des_Table6[i]);

  219.   memcpy(extkey, key, 56);
  220.   Des_TransPose(extkey, Des_Table2, 48);

  221.   for (i_temp1 = 0; i_temp1 < 48; i_temp1++)
  222.     if (extr32[i_temp1] == extkey[i_temp1])
  223.       extr32[i_temp1] = 0;
  224.     else
  225.       extr32[i_temp1] = 1;

  226.   for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  227.   {
  228.     c_temp1 = (byte)(extr32[i_temp1 * 6] * 32 +
  229.              extr32[i_temp1 * 6 + 5] * 16 +
  230.              extr32[i_temp1 * 6 + 1] *  8 +
  231.              extr32[i_temp1 * 6 + 2] *  4 +
  232.              extr32[i_temp1 * 6 + 3] *  2 +
  233.              extr32[i_temp1 * 6 + 4]);
  234.     c_temp1 = Des_Table8[i_temp1][c_temp1];
  235.     if (c_temp1 >= 8)
  236.     {
  237.       PB[i_temp1 * 4] = 1;
  238.       c_temp1 = (byte)(c_temp1 - 8);
  239.     }
  240.     else
  241.       PB[i_temp1 * 4] = 0;
  242.     if (c_temp1 >= 4)
  243.     {
  244.       PB[i_temp1 * 4 + 1] = 1;
  245.       c_temp1 = (byte)(c_temp1 - 4);
  246.     }
  247.     else
  248.       PB[i_temp1 * 4 + 1] = 0;
  249.     if (c_temp1 >= 2)
  250.     {
  251.       PB[i_temp1 * 4 + 2] = 1;
  252.       c_temp1 = (byte)(c_temp1 - 2);
  253.     }
  254.     else
  255.       PB[i_temp1 * 4 + 2] = 0;
  256.     if (c_temp1 >= 1)
  257.       PB[i_temp1 * 4 + 3] = 1;
  258.     else
  259.       PB[i_temp1 * 4 + 3] = 0;
  260.   }
  261.   Des_TransPose(PB, Des_Table7, 32);
  262.   return;
  263. }

  264. void Des_Lshift(byte *key, byte cnt)
  265. {
  266. byte c_temp1, c_temp2;
  267. int  i_temp1,i_temp2;

  268.   for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
  269.   {
  270.     c_temp1 = key[0];
  271.     c_temp2 = key[28];
  272.     for (i_temp1 = 0; i_temp1 < 55; i_temp1++)
  273.       key[i_temp1] = key[i_temp1 + 1];
  274.     key[27] = c_temp1;
  275.     key[55] = c_temp2;
  276.   }
  277.   return;
  278. }

  279. void Des_Rshift(byte *key, byte cnt)
  280. {
  281. byte c_temp1, c_temp2;
  282. int  i_temp1,i_temp2;

  283.   for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
  284.   {
  285.     c_temp1 = key[27];
  286.     c_temp2 = key[55];
  287.     for (i_temp1 = 55; i_temp1 >0; i_temp1--)
  288.       key[i_temp1] = key[i_temp1 - 1];
  289.     key[0] = c_temp1;
  290.     key[28] = c_temp2;
  291.   }
  292.   return;
  293. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2006-03-01 08:50 |只看该作者
DES如果你不知道怎么回事,恐怕给你代码你也不会用的

论坛徽章:
0
4 [报告]
发表于 2006-03-01 11:47 |只看该作者
晕倒,要是这些加密算法谁用谁就自己写那还不累死.
当然用现成的了.
为什么我用DES就一定要知道他是怎么回事.
我只要知道接口就可以了.
这年代你要等什么都知道清楚了再开始干活,那你就永远干不了活了.

论坛徽章:
0
5 [报告]
发表于 2006-03-01 12:01 |只看该作者
弄清楚比较好,如果你只是单纯享用一下,查RFC比较好,有代码可以用的,封装好的

论坛徽章:
0
6 [报告]
发表于 2006-03-12 15:38 |只看该作者

回复 5楼 net_robber 的帖子

我想这个应该是用控制文件来运行的吧?
嘿嘿,THANK  YOU!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP