免费注册 查看新帖 |

Chinaunix

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

DES初始置换的疑惑? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-26 18:48 |只看该作者 |倒序浏览
自己想实现DES,参考了一下OpenSSL的源代码,却发现代码是如此的难懂,看得真是郁闷~~~~~~~
连第一步初始IP置换都没看明白,想请高手指教一下


  1. #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
  2.         (b)^=(t),\
  3.         (a)^=((t)<<(n)))

  4. #define IP(l,r) \
  5.         { \
  6.         register DES_LONG tt; \
  7.         PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \
  8.         PERM_OP(l,r,tt,16,0x0000ffffL); \
  9.         PERM_OP(r,l,tt, 2,0x33333333L); \
  10.         PERM_OP(l,r,tt, 8,0x00ff00ffL); \
  11.         PERM_OP(r,l,tt, 1,0x55555555L); \
  12.         }
复制代码


还好原作者写了个注释,说是这是个几何问题,说下面的代码可以在DES的两个word之间交换bit,他还举了个例子,例子是看明白了(例子中居然还有个小错误!!郁闷!!)


  1. t=((l>>size)^r)&(mask);
  2.         r^=t;
  3.         l^=(t<<size);
复制代码


但是最后DES的初始置换的代码还是没弄明白~~~

论坛徽章:
0
2 [报告]
发表于 2006-06-26 19:13 |只看该作者
那是先有算法后有标准的东西,初始置换不增加任何安全性

论坛徽章:
0
3 [报告]
发表于 2006-06-26 19:51 |只看该作者
是啊,但是那个按bit置换还是没有弄明白啊。

OpenSSL的作者原话说的是:
Thanks for hints from Richard Outerbridge - he told me IP&FP
could be done in 15 xor, 10 shifts and 5 ands.
When I finally started to think of the problem in 2D
I first got ~42 operations without xors.  When I remembered
how to use xors I got it to its final state.


感觉不像是一开始就是这么实现的啊

再把作者的注释附上:

        /* IP and FP
         * The problem is more of a geometric problem that random bit fiddling.
         0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
         8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
        16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
        24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0

        32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
        40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
        48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
        56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1

        The output has been subject to swaps of the form
        0 1 -> 3 1 but the odd and even bits have been put into
        2 3    2 0
        different words.  The main trick is to remember that
        t=((l>>size)^r)&(mask);
        r^=t;
        l^=(t<<size);
        can be used to swap and move bits between words.

        So l =  0  1  2  3  r = 16 17 18 19
                4  5  6  7      20 21 22 23
                8  9 10 11      24 25 26 27
               12 13 14 15      28 29 30 31
        becomes (for size == 2 and mask == 0x3333)
           t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
                 6^20  7^21 -- --        4  5 20 21       6  7 22 23
                10^24 11^25 -- --        8  9 24 25      10 11 24 25
                14^28 15^29 -- --       12 13 28 29      14 15 28 29

论坛徽章:
0
4 [报告]
发表于 2006-06-26 23:51 |只看该作者
硬件实现很容易,客观上会降低一点软件处理的速度
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP