【问题标题】:Looking for DES algorithm tutorial [closed]寻找DES算法教程[关闭]
【发布时间】:2008-10-05 22:03:43
【问题描述】:

我正在学习密码学,但不知何故我一直在理解 DES 的工作原理。因为它已经存在了很长时间,所以网络上应该有很好的教程,比如精美的图表、视频等。我搜索但没有运气。有没有人发现大脑“容易消化”的东西?

【问题讨论】:

  • 关于downvoting:这个问题是在 Stack Overflow 可以接受此类问题时提出的。否决投票会惩罚向他们询问今天什么是有意义的,这有点……嗯

标签: algorithm cryptography des


【解决方案1】:

Bruce Schneier 的应用密码学可能是您会发现的最有趣的分析,但它肯定不容易。

【讨论】:

  • 我还必须补充一下,因为我最初需要了解密码学课程的DES,这也是每个教授都想强调的......当然正如很多人指出的那样不容易,我经过多次迭代和与同学讨论后获得理解。
【解决方案2】:

你检查过Wikipedia吗? 它还指向 FIPS 标准。

请注意,现代密码学和“易上手”不一定齐头并进...

如果你感兴趣的话,我确信有一些开源实现可以查看。

【讨论】:

    【解决方案3】:

    用java中的字符串模拟des-3des加密解密:

    public class Filippakoc_Des {
    static int[][] sb1={
        {14 , 4 , 13 , 1 , 2 , 15 , 11 , 8 , 3 , 10 , 6 , 12 , 5 , 9 , 0 , 7 },
        {0  , 15,  7 , 4 , 14, 2  ,  13,  1, 10,   6, 12,  11,  9,  5,  3,  8},
        {4  ,  1,  14,  8, 13,   6,   2, 11, 15,  12,  9,   7,  3, 10,  5,  0},
        {15 , 12,   8,  2,  4,   9,   1,  7,  5,  11,  3,  14, 10,  0,  6,  13}
    };
     static int[][] sb2={
        {15 , 1 , 8 , 14, 6 ,  11,   3,  4, 9 , 7 ,  2, 13 , 12, 0, 5 ,  10},
        {3  , 13,  4,  7, 15,   2,   8, 14, 12,  0,  1,  10,  6, 9, 11,   5},
        {0  , 14,  7, 11, 10,   4,  13,  1, 5 ,  8, 12,   6,  9, 3,  2,  15},
        {13 , 8 , 10,  1,  3,  15,   4,  2, 11,  6,  7,  12, 0 , 5,  14,  9}
    };
     static int[][] sb3={
        {10 , 0 ,  9,14,  6,    3,  15,  5, 1, 13,  12, 7 , 11,  4,   2,   8},
        {13 ,  7,  0, 9,  3,    4,   6, 10, 2,  8,   5, 14, 12, 11,  15,   1},
        {13 ,  6,  4, 9,  8,   15,   3,  0,11,  1,   2, 12,  5, 10,  14,   7},
        {1  , 10 ,13, 0,  6,    9,   8,  7, 4, 15,  14,  3, 11,  5,   2,  12}
    };
       static int[][] sb4={
        { 7 , 13, 14, 3,   0,  6,   9, 10, 1, 2,  8,  5, 11, 12,  4,  15},
        {13 ,  8, 11, 5,   6, 15,   0,  3, 4, 7,  2, 12,  1, 10, 14,   9},
        {10 ,  6,  9, 0,  12, 11,   7, 13,15, 1,  3, 14,  5,  2,  8,   4},
        {3  , 15,  0, 6,  10,  1,   13, 8, 9, 4,  5, 11, 12,  7,  2,  14}
    };
         static int[][] sb5={
        { 2, 12,  4,  1,  7,  10, 11, 6,  8,  5,   3, 15, 13,  0, 14,  9},
        {14, 11,  2, 12,  4,   7, 13, 1,  5,  0,  15, 10,  3,  9,  8,  6},
        {4 ,  2,  1, 11, 10,  13,  7, 8, 15,  9,  12,  5,  6,  3,  0, 14},
        {11,  8, 12, 7 ,  1,  14,  2, 13, 6, 15,   0,  9, 10,  4,  5,  3}
    };
               static int[][] sb6={
        { 12, 1, 10, 15,  9,  2,  6, 8,  0,  13,   3,  4, 14,  7,  5, 11},
        {10, 15,  4,  2,  7, 12,  9, 5,  6,   1,  13, 14,  0,  11, 3,  8},
        {9 , 14, 15,  5,  2,  8, 12, 3,  7,   0,   4, 10,  1,  13,11,  6},
        {4,   3, 12, 12,  9,  5, 15, 10,11,  14,   1,  7,  6,   0, 8, 13}
    };
               static int[][] sb7={
        { 4,11,  2, 14,  15, 0,  8, 13,  3,  12,  9,  7,  5, 10, 6, 1},
        {13, 0, 11,  7,  4,  9,  1, 10, 14,   3,  5, 12,  2, 15, 8,  6},
        {1 , 4, 11, 13,  12, 3, 7,  14, 10,  15,  6,  8,  0,  5, 9,  2},
        {6, 11, 13,  8,  1,  4, 10,  7,  9,   5,  0, 15, 14,  2, 3, 12}
    };
               static int[][] sb8={
        {13,  2,  8,  4,   6,  15, 11,  1, 10,  9,  3,14,  5, 0, 12,  7},
        { 1, 15, 13,  8,  10,   3,  7,  4, 12,  5,  6,11,  0, 14, 9,  2},
        {7 , 11,  4,  1,   9,  12, 14,  2,  0,  6, 10,13, 15,  3, 5,  8},
        { 2,  1, 14,  7,   4,  10,  8, 13, 15, 12,  9, 0,  3,  5, 6, 11}
    };
    
         public String Filippakoc_Des(String ptxt,String key,boolean encdes){
             //String a=String.format("%64s", Integer.toBinaryString(255)).replace(' ', '0');
             //String b="1011011111001001100001110000101110110000010001110101111101001010";
             String ipa=IPpermutation(ptxt);
             String ipb=IPpermutation(ptxt);
             String[] keys=Keygenerate(key);
             String[] rounds=new String[16];
             String cripttext="";
             if(encdes==true){
                  for(int i=0;i<rounds.length;i++){
                 if(i<1){
                 rounds[i]=round(ipa,keys[i]);
                 }else{
                     rounds[i]=round(rounds[i-1],keys[i]);
                 }
    
    
                }
    
             cripttext=IPpermutation_(rounds[15]);
             //System.out.println(ptxt);
             //System.out.println(cripttext);
             }else{
                  for(int i=rounds.length-1;i>=0;i--){
                   if(i>14){
                 rounds[i]=dround(ipb,keys[i]);
                 }else{
                     rounds[i]=dround(rounds[i+1],keys[i]);
                 }
    
             }
             cripttext=IPpermutation_(rounds[0]);
             //System.out.println(ptxt);
             //System.out.println(cripttext);
             }
    
    
            return cripttext;
    
             //String a=String.format("%32s", Integer.toBinaryString(255)).replace(' ', '0');
             //String b=String.format("%48s", Integer.toBinaryString(21)).replace(' ', '0');
             //System.out.println(functionf(a, b));
             //System.out.println(xor(a,b));
         }
         public String Filippakoc_3des(String ptxt,String key1,String key2,String key3,boolean encdes){
             String En="";
             if(encdes){
               En=Filippakoc_Des(ptxt, key1, true);
             En=En=Filippakoc_Des(En, key2, false);
              En=En=Filippakoc_Des(En, key3, true);
             }else{
                 En=Filippakoc_Des(ptxt, key1, false);
             En=En=Filippakoc_Des(En, key2, true);
              En=En=Filippakoc_Des(En, key3, false);
             }
    
              return En;
    
         }
         public String round(String plain64,String keyi){
    
             String li=plain64.substring(0,32);
             String ri=plain64.substring(32);
    
             String ro=xor(li,functionf(ri,keyi));
             String lo=ri;
             String resultround=lo+ro;
             return resultround;
         }
         public String dround(String plain64,String keyi){
                  String li=plain64.substring(0,32);
             String ri=plain64.substring(32);
    
             String lo=xor(ri,functionf(li,keyi));
             String ro=li;
             String resultround=lo+ro;
             return resultround;
         }
         public String xor(String a,String b){
             String res="";
             for(int i=0;i<a.length();i++){
                 if(a.charAt(i)=='0' && b.charAt(i)=='0'){
                     res+='0';
                 }else  if(a.charAt(i)=='0' && b.charAt(i)=='1'){
                     res+='1';
                 }else  if(a.charAt(i)=='1' && b.charAt(i)=='0'){
                     res+='1';
                 }else  if(a.charAt(i)=='1' && b.charAt(i)=='1'){
                     res+='0';
                 }
             }
             return res;
         }
         public String sboxesrtn(int ff){
             String sb=Integer.toBinaryString(ff);
             if(ff<2){
                 sb="000"+sb;
             }else if(ff<4){
                 sb="00"+sb;
             }else if(ff<8){
                 sb="0"+sb;
             }
             return sb;
         }
         public String functionf(String r32,String k48){
             String r48=Epermutation(r32);
             String xorout=xor(r48, k48);
             String[] splitto6=new String[8];
             splitto6[0]=xorout.substring(0,6);
             splitto6[1]=xorout.substring(6,12);
             splitto6[2]=xorout.substring(12,18);
             splitto6[3]=xorout.substring(18,24);
             splitto6[4]=xorout.substring(24,30);
             splitto6[5]=xorout.substring(30,36);
             splitto6[6]=xorout.substring(36,42);
             splitto6[7]=xorout.substring(42);
             String rnew32="";
             String row;
             String column="";
             for(int i=0;i<splitto6.length;i++){
                row=""+splitto6[i].charAt(0)+splitto6[i].charAt(5);
                column=splitto6[i].substring(1,5);
                //System.out.println(splitto6[i]+"  "+row+"  "+column);
                int irow=Integer.parseInt(row, 2);
                int icolumn=Integer.parseInt(column, 2);
                if(i==0){
                    //rnew32+=Integer.toBinaryString(sb1[irow][icolumn]);
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb1[irow][icolumn])).replace(' ', '0');
                }else if(i==1){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb2[irow][icolumn])).replace(' ', '0');
                }else if(i==2){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb3[irow][icolumn])).replace(' ', '0');
                }else if(i==3){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb4[irow][icolumn])).replace(' ', '0');
                }else if(i==4){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb5[irow][icolumn])).replace(' ', '0');
                }else if(i==5){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb6[irow][icolumn])).replace(' ', '0');
                }else if(i==6){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb7[irow][icolumn])).replace(' ', '0');
                }else if(i==7){
                    rnew32+=String.format("%4s", Integer.toBinaryString(sb8[irow][icolumn])).replace(' ', '0');
                }
             }
    
    
            //System.out.println(rnew32.length());
            //System.out.println(rnew32);
            // System.out.print(splitto6[0]+"  "+splitto6[1]+"  "+splitto6[2]+"  "+splitto6[3]+"  "+splitto6[4]+"  "+splitto6[5]+"  "+splitto6[6]+"  "+splitto6[7]+"\n");
             rnew32=Ppermutation(rnew32);
             return rnew32;
    
         }
         public String Epermutation(String r32){
             r32=" "+r32;
             String r48=""+r32.charAt(31)+r32.charAt(1)+r32.charAt(2)+r32.charAt(3)+r32.charAt(4)+r32.charAt(5)+r32.charAt(4)+r32.charAt(5)+r32.charAt(6)+r32.charAt(7)+r32.charAt(8)+r32.charAt(9)+r32.charAt(8)+r32.charAt(9)+r32.charAt(10)+r32.charAt(11)+r32.charAt(12)+r32.charAt(13)+r32.charAt(12)+r32.charAt(13)+r32.charAt(14)+r32.charAt(15)+r32.charAt(16)+r32.charAt(17)+r32.charAt(16)+r32.charAt(17)+r32.charAt(18)+r32.charAt(19)+r32.charAt(20)+r32.charAt(21)+r32.charAt(20)+r32.charAt(21)+r32.charAt(22)+r32.charAt(23)+r32.charAt(24)+r32.charAt(25)+r32.charAt(24)+r32.charAt(25)+r32.charAt(26)+r32.charAt(27)+r32.charAt(28)+r32.charAt(29)+r32.charAt(28)+r32.charAt(29)+r32.charAt(30)+r32.charAt(31)+r32.charAt(32)+r32.charAt(1);
             return r48;
         }
         public String Ppermutation(String r32){
             r32=" "+r32;
             String r32p=""+r32.charAt(17)+r32.charAt(7)+r32.charAt(20)+r32.charAt(21)+r32.charAt(29)+r32.charAt(12)+r32.charAt(28)+r32.charAt(17)+r32.charAt(1)+r32.charAt(15)+r32.charAt(23)+r32.charAt(26)+r32.charAt(5)+r32.charAt(18)+r32.charAt(31)+r32.charAt(10)+r32.charAt(2)+r32.charAt(8)+r32.charAt(24)+r32.charAt(14)+r32.charAt(32)+r32.charAt(27)+r32.charAt(3)+r32.charAt(9)+r32.charAt(19)+r32.charAt(13)+r32.charAt(30)+r32.charAt(6)+r32.charAt(22)+r32.charAt(11)+r32.charAt(4)+r32.charAt(25);
             return r32p;
         }
          public String IPpermutation(String r64){
             r64=" "+r64;
             String r64p=""+r64.charAt(58)+r64.charAt(50)+r64.charAt(42)+ r64.charAt(34)+r64.charAt(26)+r64.charAt(18)+r64.charAt(10)+r64.charAt(2)
                     +r64.charAt(60)+r64.charAt(52)+r64.charAt(44)+r64.charAt(36)+r64.charAt(28)+r64.charAt(20)+r64.charAt(12)+r64.charAt(4)+
                     r64.charAt(62)+r64.charAt(54)+r64.charAt(46)+r64.charAt(38)+r64.charAt(30)+r64.charAt(22)+r64.charAt(14)+r64.charAt(6)+
                     r64.charAt(64)+r64.charAt(56)+r64.charAt(48)+r64.charAt(40)+r64.charAt(32)+r64.charAt(24)+r64.charAt(16)+r64.charAt(8)+
                     r64.charAt(57)+r64.charAt(49)+ r64.charAt(41)+r64.charAt(33)+r64.charAt(25)+r64.charAt(17)+r64.charAt(9)+r64.charAt(1)+
                     r64.charAt(59)+r64.charAt(51)+r64.charAt(43)+r64.charAt(35)+r64.charAt(27)+r64.charAt(19)+r64.charAt(11)+r64.charAt(3)+
                     r64.charAt(61)+r64.charAt(53)+r64.charAt(45)+r64.charAt(37)+r64.charAt(29)+r64.charAt(21)+r64.charAt(13)+r64.charAt(5)+
                     r64.charAt(63)+r64.charAt(55)+r64.charAt(47)+r64.charAt(39)+r64.charAt(31)+r64.charAt(23)+r64.charAt(15)+r64.charAt(7);
             return r64p;
         }
           public String IPpermutation_(String r64){
             r64=" "+r64;
             String r64p=""+
                     r64.charAt(40)+r64.charAt(8)+r64.charAt(48)+ r64.charAt(16)+r64.charAt(56)+r64.charAt(24)+r64.charAt(64)+r64.charAt(32)+
                     r64.charAt(39)+r64.charAt(7)+r64.charAt(47)+r64.charAt(15)+r64.charAt(55)+r64.charAt(23)+r64.charAt(63)+r64.charAt(31)+
                     r64.charAt(38)+r64.charAt(6)+r64.charAt(46)+r64.charAt(14)+r64.charAt(54)+r64.charAt(22)+r64.charAt(62)+r64.charAt(30)+
                     r64.charAt(37)+r64.charAt(5)+r64.charAt(45)+r64.charAt(13)+r64.charAt(53)+r64.charAt(21)+r64.charAt(61)+r64.charAt(29)+
                     r64.charAt(36)+r64.charAt(4)+ r64.charAt(44)+r64.charAt(12)+r64.charAt(52)+r64.charAt(20)+r64.charAt(60)+r64.charAt(28)+
                     r64.charAt(35)+r64.charAt(3)+r64.charAt(43)+r64.charAt(11)+r64.charAt(51)+r64.charAt(19)+r64.charAt(59)+r64.charAt(27)+
                     r64.charAt(34)+r64.charAt(2)+r64.charAt(42)+r64.charAt(10)+r64.charAt(50)+r64.charAt(18)+r64.charAt(58)+r64.charAt(26)+
                     r64.charAt(33)+r64.charAt(1)+r64.charAt(41)+r64.charAt(9)+r64.charAt(49)+r64.charAt(17)+r64.charAt(57)+r64.charAt(25);
             return r64p;
         }
         public String[] Keygenerate(String key){
        String[] keys=new String[16];
        String key56=pc_1(key);
        String lkey28=key56.substring(0,28);
        String rkey28=key56.substring(28);
          for(int i=0;i<keys.length;i++){
                if(i==0 || i==1 || i==8 || i==15){
                    lkey28=Lbitrotate(lkey28, 1);
                    rkey28=Lbitrotate(rkey28, 1);
                    keys[i]=pc_2(lkey28+rkey28);
                }else{
                    lkey28=Lbitrotate(lkey28, 2);
                    rkey28=Lbitrotate(rkey28, 2);
                    keys[i]=pc_2(lkey28+rkey28);
                }
            }
    
        return keys;
    
    }
    public String pc_1(String key){
        String key56="";
        key56=""+key.charAt(56)+key.charAt(48)+key.charAt(40)+key.charAt(32)+key.charAt(24)+key.charAt(16)+key.charAt(8)+key.charAt(0)+key.charAt(57)+key.charAt(49)+key.charAt(41)+key.charAt(33)+key.charAt(25)+key.charAt(17)+key.charAt(9)+key.charAt(1)+key.charAt(58)+key.charAt(50)+key.charAt(42)+key.charAt(34)+key.charAt(26)+key.charAt(18)+key.charAt(10)+key.charAt(2)+key.charAt(59)+key.charAt(51)+key.charAt(43)+key.charAt(35)+key.charAt(62)+key.charAt(54)+key.charAt(46)+key.charAt(38)+key.charAt(30)+key.charAt(23)+key.charAt(14)+key.charAt(6)+key.charAt(61)+key.charAt(53)+key.charAt(45)+key.charAt(37)+key.charAt(29)+key.charAt(21)+key.charAt(13)+key.charAt(5)+key.charAt(60)+key.charAt(52)+key.charAt(44)+key.charAt(36)+key.charAt(28)+key.charAt(20)+key.charAt(12)+key.charAt(4)+key.charAt(27)+key.charAt(19)+key.charAt(11)+key.charAt(3);
        return key56;
    }
       public String pc_2(String key){
        String key48="";
        key48=""+key.charAt(13)+key.charAt(16)+key.charAt(10)+key.charAt(23)+key.charAt(0)+key.charAt(4)+key.charAt(2)+key.charAt(27)+key.charAt(14)+key.charAt(5)+key.charAt(20)+key.charAt(9)+key.charAt(22)+key.charAt(18)+key.charAt(11)+key.charAt(3)+key.charAt(25)+key.charAt(7)+key.charAt(15)+key.charAt(6)+key.charAt(26)+key.charAt(19)+key.charAt(12)+key.charAt(1)+key.charAt(40)+key.charAt(51)+key.charAt(30)+key.charAt(36)+key.charAt(46)+key.charAt(54)+key.charAt(29)+key.charAt(39)+key.charAt(50)+key.charAt(44)+key.charAt(32)+key.charAt(47)+key.charAt(43)+key.charAt(48)+key.charAt(38)+key.charAt(55)+key.charAt(33)+key.charAt(52)+key.charAt(45)+key.charAt(41)+key.charAt(49)+key.charAt(35)+key.charAt(28)+key.charAt(31);
        return key48;
    }
    
    
      public String Lbitrotate(String bin,int times){
       String binary=bin;
       String binary2="";
       String binarynew="";
       for(int i=0;i<times;i++){
           if(i<1){
           binary2=binary.substring(1)+binary.charAt(0);
           }else{
               binary2=binarynew.substring(1)+binarynew.charAt(0);
           }
           binarynew=binary2;
    
       }
       return binary2;
    

    } }

    【讨论】:

      【解决方案4】:

      The DES Algorithm Illustrated 是我见过的 DES 最好的简单总结(易于消化)。

      实际图片见How DES WorksMirror of How DES Works

      对于 AES,有 A Stick Figure Guide to the Advanced Encryption Standard (AES)

      【讨论】:

      • 喜欢 AES 漫画(有时间会看),“DES 的工作原理”给了我 403,“DES...”实际上很简单,也是我当时需要的。
      • 我检查了两个链接,但它们都不起作用。任何人都可以提供更新的链接吗? -谢谢。
      • 更新了第一个链接,第二个链接在这里有效
      • DES 的工作原理不起作用。其他两个链接都很好。
      【解决方案5】:

      我查看了维基百科,似乎我需要更多。我也认为 Schneier 的书很完美,我把它带回家了,无法将它运送到我学习的地方:-( 耻辱....
      没有人说这会很容易,也许我应该多读几遍,然后把它写在纸上,直到它卡在我的脑海里(或者已经发布了应用密码学)。
      感谢您的快速回答。

      【讨论】:

        【解决方案6】:

        我发现重复次数越多效果越好!还发现了一个艰难的方法,日复一日地做这件事比一次性做更有帮助。至少我可以得到一本 Schneier 的书,这对我很有帮助。
        自己编写不是一种选择,因为它是每周的新算法,但它是一个非常有趣、有用(有时也很明显)的想法。
        它与 DES 无关,您说服我学习 Python :-)

        【讨论】:

        • 有趣 - DES 也是如此 - 现在它们通常重复三个 ;-)
        猜你喜欢
        • 2011-08-06
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 2012-01-22
        相关资源
        最近更新 更多