CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

请教DES加密算法中的 密匙转换部分程序

楼主iknowyough(aa)2005-04-04 16:43:55 在 C/C++ / C++ 语言 提问

我有一段代码,看不懂。高手指教下  
  static   unsigned   long   KnL[32]   =   {   0L   };  
  static   unsigned   long   KnR[32]   =   {   0L   };  
  static   unsigned   long   Kn3[32]   =   {   0L   };  
   
  static   unsigned   char   Df_Key[24]   =   {  
  0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,  
  0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,  
  0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67   };  
   
  static   unsigned   long   bigbyte[24]   =   {  
  0x800000L, 0x400000L, 0x200000L, 0x100000L,  
  0x80000L, 0x40000L, 0x20000L, 0x10000L,  
  0x8000L, 0x4000L, 0x2000L, 0x1000L,  
  0x800L,   0x400L,   0x200L,   0x100L,  
  0x80L, 0x40L, 0x20L, 0x10L,  
  0x8L, 0x4L, 0x2L, 0x1L };  
   
  /*   Use   the   key   schedule   specified   in   the   Standard   (ANSI   X3.92-1981).   */  
  static   unsigned   char   pc1[56]   =   {  
  56,   48,   40,   32,   24,   16,     8,   0,   57,   49,   41,   33,   25,   17,  
    9,     1,   58,   50,   42,   34,   26, 18,   10,     2,   59,   51,   43,   35,  
  62,   54,   46,   38,   30,   22,   14,   6,   61,   53,   45,   37,   29,   21,  
  13,     5,   60,   52,   44,   36,   28, 20,   12,     4,   27,   19,   11,     3   };  
  //第一位为输入的64位密钥的第56位,A的第2位为64位密钥的第48位,...,  
  //依此类推,A的最后一位最后一位是64位密钥的第35位。  
   
  static   unsigned   char   totrot[16]   =   {  
  1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28   };  
   
  static   unsigned   char   pc2[48]   =   {  
  13,   16,   10,   23,     0,     4,     2,   27,   14,     5,   20,     9,  
  22,   18,   11,     3,   25,     7,   15,     6,   26,   19,   12,     1,  
  40,   51,   30,   36,   46,   54,   29,   39,   50,   44,   32,   47,  
  43,   48,   38,   55,   33,   52,   45,   41,   49,   35,   28,   31   };  
   
  static   unsigned   short   bytebit[8]   =   {  
  0200,   0100,   040,   020,   010,   04,   02,   01   };  
  //     128       64         32       16       8         4       2       1  
   
  void   deskey(unsigned   char   *key,short   edf)  
  //unsigned   char   *key;输入64二进制位密匙  
  //short   edf;  
  //des_enc   加密调用deskey(key,EN0);   des_dec   解密调用deskey(key,DE1);  
  {  
  register   int   i,   j,   l,   m,   n;  
  unsigned   char   pc1m[56],   pcr[56];  
  unsigned   long   kn[32];  
   
  for   (   j   =   0;   j   <   56;   j++   )   {  
  l   =   pc1[j];  
  m   =   l   &   07;  
  pc1m[j]   =   (key[l   >>   3]   &   bytebit[m])   ?   1   :   0;  
  }//从key中取出   实际加密用的56位  
   
  for(   i   =   0;   i   <   16;   i++   )   {  
  if(   edf   ==   DE1   )   m   =   (15   -   i)   <<   1;  
  else   m   =   i   <<   1;  
   
  n   =   m   +   1;  
  kn[m]   =   kn[n]   =   0L;  
  for(   j   =   0;   j   <   28;   j++   )   {  
  l   =   j   +   totrot[i];  
  if(   l   <   28   )   pcr[j]   =   pc1m[l];  
  else   pcr[j]   =   pc1m[l   -   28];  
  }  
  for(   j   =   28;   j   <   56;   j++   )   {  
          l   =   j   +   totrot[i];  
          if(   l   <   56   )   pcr[j]   =   pc1m[l];  
          else   pcr[j]   =   pc1m[l   -   28];  
          }  
  for(   j   =   0;   j   <   24;   j++   )   {  
  if(   pcr[pc2[j]]   )   kn[m]   |=   bigbyte[j];  
  if(   pcr[pc2[j+24]]   )   kn[n]   |=   bigbyte[j];  
  }  
  }  
  cookey(kn);  
  return;  
  }  
   
  static   void   cookey(register   unsigned   long   *raw1)  
  //register   unsigned   long   *raw1;  
  {  
  register   unsigned   long   *cook,   *raw0;  
  unsigned   long   dough[32];  
  register   int   i;  
   
  cook   =   dough;  
  for(   i   =   0;   i   <   16;   i++,   raw1++   )   {  
  raw0   =   raw1++;  
  *cook   =   (*raw0   &   0x00fc0000L)   <<   6;  
  *cook |=   (*raw0   &   0x00000fc0L)   <<   10;  
  *cook |=   (*raw1   &   0x00fc0000L)   >>   10;  
  *cook++   |=   (*raw1   &   0x00000fc0L)   >>   6;  
  *cook   =   (*raw0   &   0x0003f000L)   <<   12;  
  *cook |=   (*raw0   &   0x0000003fL)   <<   16;  
  *cook |=   (*raw1   &   0x0003f000L)   >>   4;  
  *cook++   |=   (*raw1   &   0x0000003fL);  
  }  
  usekey(dough);  
  return;  
  } 问题点数:0、回复次数:4Top

1 楼steedhorse(晨星)回复于 2005-04-04 16:48:15 得分 0

你得先理解DES算法,这样直接看不把人看死才怪。  
  建议看看《密码编码学与网络安全》或者《应用密码学》。Top

2 楼longlijun(风之力)回复于 2005-04-04 18:04:26 得分 0

又是一个DES的。       最好先看看算法过程,   再看代码,Top

3 楼boguang(波波)回复于 2005-04-04 18:24:57 得分 0

最好先看看     <<应用密码学>>     在分析好啦,如果想要我可以发给你:boguang20002003@163.comTop

4 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 18:41:14 得分 0

先看算法,再看代码吧Top

相关问题

  • 谁有加密算法的源程序,比如des、rc4等
  • DES加密算法的原程序或例子及使用说明?
  • 关于DES加密算法
  • 求!!DES加密算法!!
  • 哪位能给我提供DES加密算法的源程序,最好是VB写的,谢谢!(在线等待)
  • <求救>DES及3DES加密算法
  • 求教AWORD 的COMS加密算法. 最好附程序.
  • *****高分寻求一个MD5加密算法的c源程序******
  • 谁知道哪有DES加密算法的C++实现代码?
  • 加密算法DES,3DES的资料哪儿有啊? 高分求教!

关键词

  • 64位
  • pc
  • deskey
  • des
  • static unsigned
  • cook
  • raw
  • 看看
  • unsigned
  • key

得分解答快速导航

  • 帖主:iknowyough

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo