经典加密算法在VB中的实现--DES

经典加密算法在VB中的实现--DES    
  一、算法实现    
  1.处理密钥:    
  1.1     从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每    
  个密钥要有奇数个”1”位.(本文如未特指,均指二进制位)    
  1.2   具体过程:    
  1.2.1对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如    
  下表所示:    
                    表一为忽略校验位以后情况    
  1             2           3           4           5           6           7           8           9         10         11         12        
      13         14         15         16         17         18         19         20         21         22         23         24    
          25         26         27         28    
  57         49         41         33         25         17           9           1         58         50         42         34        
      26         18         10           2         59         51         43         35         27         19         11           3    
          60         52         44         36    
  29         30         31         32         33         34         35         36         37         38         39         40        
      41         42         43         44         45         46         47         48         49         50         51         52    
          53         54         55         56    
  63         55         47         39         31         23         15           7         62         54         46         38        
      30         22         14           6         61         53         45         37         29         21         13           5    
          28         20         12           4    
  1.2.2     把变换后的密钥等分成两部分,前28位记为c[0],   后28位记为d[0].    
  1.2.3     计算子密钥(共16个),   从i=1开始。    
  1.2.3.1   分别对c[i-1],d[i-1]作循环左移来生成c[i],d[i].(共16次)。每次循环左移位数如下表所示:    
  循环次数         1         2         3         4         5         6         7         8         9         10         11         1    
  2         13         14         15         16    
  左移位数         1         1         2         2         2         2         2         2         1           2           2                
  2           2           2           2           1    
  1.2.3.2   串联c[i],d[i],得到一个56位数,然后对此数作如下变换以产生48位子密钥k[i]。    
                  变换过程如下:    
  1             2           3           4           5           6           7           8           9         10         11         12        
      13         14         15         16         17         18         19         20         21         22         23         24    
   
  14         17         11         24           1           5           3         28         15           6         21         10        
      23         19         12           4         26           8         16           7         27         20         13           2    
   
  25         26         27         28         29         30         31         32         33         34         35         36        
      37         38         39         40         41         42         43         44         45         46         47         48    
   
  41         52         31         37         47         55         30         40         51         45         33         48        
      44         49         39         56         34         53         46         42         50         36         29         32    
  1.2.3.3         按以上方法计算出16个子密钥。    
  2.对64位数据块的处理:    
  2.1   把数据分成64位的数据块,不够64位的以适当的方式填补。    
  2.2对数据块作变换。    
  bit         goes   to   bit         bit         goes   to   bit    
  58             1                           57           33    
  50             2                           49           34    
  42             3                           41           35    
  34             4                           33           36    
  26             5                           25           37    
  18             6                           17           38    
  10             7                             9           39    
  2               8                             1           40    
  60             9                           59           41    
  52           10                           51           42    
  44           11                           43           43    
  36           12                           35           44    
  28           13                           27           45    
  20           14                           19           46    
  12           15                           11           47    
  4             16                             3           48    
  62           17                           61           49    
  54           18                           53           50    
  46           19                           45           51    
  38           20                           37           52    
  30           21                           29           53    
  22           22                           21           54    
  14           23                           13           55    
  6             24                             5           56    
  64           25                           63           57    
  56           26                           55           58    
  48           27                           47           59    
  40           28                           39           60    
  32           29                           31           61    
  24           30                           23           62    
  16           31                           15           63    
  8             32                             7           64        
  2.3   将变换后的数据块等分成前后两部分,前32位记为l[0],后32位记为r[0]。    
  2.4   用16个子密钥对数据加密。    
  2.4.1   根据下面的扩冲函数e,扩展32位的成48位    
  bit         goes   to   bit         bit         goes   to   bit         bit         goes   to   bit         bit        
        goes   to   bit    
  32             1                             8           13                           16           25                           24        
        37    
  1               2                             9           14                           17           26                           25        
        38    
  2               3                           10           15                           18           27                           26        
        39    
  3               4                           11           16                           19           28                           27        
        40    
  4               5                           12           17                           20           29                           28        
        41    
  5               6                           13           18                           21           30                           29        
        42    
  4               7                           12           19                           20           31                           28        
        43    
  5               8                           13           20                           21           32                           29        
        44    
  6               9                           14           21                           22           33                           30        
        45    
  7             10                           15           22                           23           34                           31        
        46    
  8             11                           16           23                           24           35                           32        
        47    
  9             12                           17           24                           25           36                             1        
        48    
  2.4.2   用e{r[i-1]}与k[i]作异或运算。    
  2.4.3   把所得的48位数分成8个6位数。1-6位为b[1],7-12位为b[2],……43-4    
  8位为b[8]。    
  2.4.4   用s密箱里的值替换b[j]。从j=1开始。s密箱里的值为4位数,共8个s密    
  箱    
  2.4.4.1   取出b[j]的第1和第6位串联起来成一个2位数,记为m.。m即是s密箱    
  里用来替换b[j]的数所在的列数。    
  2.4.4.2   取出b[j]的第2至第5位串联起来成一个4位数,记为n。n即是s密箱里    
  用来替换b[j]的数所在的行数。
Top

7 楼rivershan(过分的比较讨论某种语言,就像站在两个槽子中间不知哪个槽子的草更好的蠢驴。)回复于 2002-04-04 10:15:23 得分 102.4.4.3   用s密箱里的值s[j][   m][   n]替换b[j]。8个s密箱如下所示:    
  --------    
  s-boxes1    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                   14           0           4         15    
  0001               1                     4         15           1         12    
  0010               2                   13           7         14           8    
  0011               3                     1           4           8           2    
  0100               4                     2         14         13           4    
  0101               5                   15           2           6           9    
  0110               6                   11         13           2           1    
  0111               7                     8           1         11           7    
  1000               8                     3         10         15           5    
  1001               9                   10           6         12         11    
  1010             10                     6         12           9           3    
  1011             11                   12         11           7         14    
  1100             12                     5           9           3         10    
  1101             13                     9           5         10           0    
  1110             14                     0           3           5           6    
  1111             15                     7           8           0         13    
  --------    
  s-boxes2    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                   15           3           0         13    
  0001               1                     1         13         14           8    
  0010               2                     8           4           7         10    
  0011               3                   14           7         11           1    
  0100               4                     6         15         10           3    
  0101               5                   11           2           4         15    
  0110               6                     3           8         13           4    
  0111               7                     4         14           1           2    
  1000               8                     9         12           5         11    
  1001               9                     7           0           8           6    
  1010             10                     2           1         12           7    
  1011             11                   13         10           6         12    
  1100             12                   12           6           9           0    
  1101             13                     0           9           3           5    
  1110             14                     5         11           2         14    
  1111             15                   10           5         15           9    
  --------    
  s-boxes3    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                   10         13         13           1    
  0001               1                     0           7           6         10    
  0010               2                     9           0           4         13    
  0011               3                   14           9           9           0    
  0100               4                     6           3           8           6    
  0101               5                     3           4         15           9    
  0110               6                   15           6           3           8    
  0111               7                     5         10           0           7    
  1000               8                     1           2         11           4    
  1001               9                   13           8           1         15    
  1010             10                   12           5           2         14    
  1011             11                     7         14         12           3    
  1100             12                   11         12           5         11    
  1101             13                     4         11         10           5    
  1110             14                     2         15         14           2    
  1111             15                     8           1           7         12    
  --------    
  s-boxes4    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                     7         13         10           3    
  0001               1                   13           8           6         15    
  0010               2                   14         11           9           0    
  0011               3                     3           5           0           6    
  0100               4                     0           6         12         10    
  0101               5                     6         15         11           1    
  0110               6                     9           0           7         13    
  0111               7                   10           3         13           8    
  1000               8                     1           4         15           9    
  1001               9                     2           7           1           4    
  1010             10                     8           2           3           5    
  1011             11                     5         12         14         11    
  1100             12                   11           1           5         12    
  1101             13                   12         10           2           7    
  1110             14                     4         14           8           2    
  1111             15                   15           9           4         14    
  --------    
  s-boxes5    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                     2         14           4         11    
  0001               1                   12         11           2           8    
  0010               2                     4           2           1         12    
  0011               3                     1         12         11           7    
  0100               4                     7           4         10           1    
  0101               5                   10           7         13         14    
  0110               6                   11         13           7           2    
  0111               7                     6           1           8         13    
  1000               8                     8           5         15           6    
  1001               9                     5           0           9         15    
  1010             10                     3         15         12           0    
  1011             11                   15         10           5           9    
  1100             12                   13           3           6         10    
  1101             13                     0           9           3           4    
  1110             14                   14           8           0           5    
  1111             15                     9           6         14           3    
  --------    
  s-boxes6    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                   12         10           9           4    
  0001               1                     1         15         14           3    
  0010               2                   10           4         15           2    
  0011               3                   15           2           5         12    
  0100               4                     9           7           2           9    
  0101               5                     2         12           8           5    
  0110               6                     6           9         12         15    
  0111               7                     8           5           3         10    
  1000               8                     0           6           7         11    
  1001               9                   13           1           0         14    
  1010             10                     3         13           4           1    
  1011             11                     4         14         10           7    
  1100             12                   14           0           1           6    
  1101             13                     7         11         13           0    
  1110             14                     5           3         11           8    
  1111             15                   11           8           6         13    
  --------    
  s-boxes7    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec         0         1           2           3    
  0000               0                     4         13           1           6    
  0001               1                   11           0           4         11    
  0010               2                     2         11         11         13    
  0011               3                   14           7         13           8    
  0100               4                   15           4         12           1    
  0101               5                     0           9           3           4    
  0110               6                     8           1           7         10    
  0111               7                   13         10         14           7    
  1000               8                     3         14         10           9    
  1001               9                   12           3         15           5    
  1010             10                     9           5           6           0    
  1011             11                     7         12           8         15    
  1100             12                     5           2           0         14    
  1101             13                   10         15           5           2    
  1110             14                     6           8           9           3    
  1111             15                     1           6           2         12    
  --------    
  s-boxes8    
  binary         d1d6   =>         00         01         10         11    
  //   d2..d5   //         dec       0           1           2           3    
  0000               0                   13           1           7           2    
  0001               1                     2         15         11           1    
  0010               2                     8         13           4         14    
  0011               3                     4           8           1           7    
  0100               4                     6         10           9           4    
  0101               5                   15           3         12         10    
  0110               6                   11           7         14           8    
  0111               7                     1           4           2         13    
  1000               8                   10         12           0         15    
  1001               9                     9           5           6         12    
  1010             10                     3           6         10           9    
  1011             11                   14         11         13           0    
  1100             12                     5           0         15           3    
  1101             13                     0         14           3           5    
  1110             14                   12           9           5           6    
  1111             15                     7           2           8         11    
  2.4.4.4   返回2.4.4.1直至8个数据块都被替换。    
  2.4.5   把b[1]至b[8]   顺序串联起来得到一个32位数。对这个数做如下变换:  
  bit         goes   to   bit         bit         goes   to   bit    
  16           1                               2           17    
  7             2                               8           18    
  20           3                             24           19    
  21           4                             14           20    
  29           5                             32           21    
  12           6                             27           22    
  28           7                               3           23    
  17           8                               9           24    
  1             9                             19           25    
  15         10                             13           26    
  23         11                             30           27    
  26         12                               6           28    
  5           13                             22           29    
  18         14                             11           30    
  31         15                               4           31    
  10         16                             25           32    
  2.4.6   把得到的结果与l[i-1]作异或运算。把计算结果賦给r[i]。    
  2.4.7   把r[i-1]的值賦给l[i]。    
  2.4.8   从2.4.1循环执行,直到k[16]也被用到。    
  2.5   把r[16]和l[16]   顺序串联起来得到一个64位数。对这个数实施2.2变换的    
  逆变换。    
          以上就是des算法如何加密一段64位数据块。解密时用同样的过程,只需把1    
  6个子密钥的顺续颠倒过来,应用的顺序为k[16],k[15],k[14],。。。。k[1]。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值