2008-10-05 102 views
0

我正在学习密码学,我不知何故坚持了解DES的工作原理。因为它已经存在了很长一段时间了,所以应该有一些漂亮的教程,比如幻想图,视频等等。我搜索,但没有运气。有没有人发现任何“易于消化”的大脑?寻找DES算法教程

+0

关于downvoting:这个问题被放在堆栈溢出时可接受的问题。向下投票惩罚问他们今天有什么意义,这有点...... meh – 2014-09-21 08:51:23

回答

1

布鲁斯施耐尔的应用密码学可能是你会发现它最有趣的分析,但它肯定不容易。

+0

我还必须补充一点,因为我最初需要了解密码学课程的DES,这也是每个教授都想强调的。 当然,很多人指出这并不容易,经过与同学的多次迭代和讨论后,我达到了理解。 – 2009-01-14 14:37:30

1

你有没有选择Wikipedia?它也指向FIPS标准。

需要注意的是现代密码学和“易于上的脑”并不一定齐头并进......

我敢肯定有开源实现,你可以看看,如果那是你

0

我查过了维基百科,似乎我需要更多。我也认为Schneier的书是完美的,我把它放回家,无法运输到我研究的地方:-(耻辱......
没有人说这会很容易,也许我应该多读几遍,把它写在纸上直到它卡在我的大脑中(或者有应用密码术发布)
感谢您的快速回答

0

我发现我做的越多重复越好!很难,日复一日地完成这一切并不仅仅是一次性的,至少我可以得到一份Schneier的书,它有很大的帮助。
写我自己不是一种选择,因为它是一个每周一个新算法,但它是一个非常有趣,有益的(有时很明显的)想法。
它没有用DES做,你说服我学习Python :-)在Java中使用字符串模拟

+0

有趣 - 与DES一样 - 他们现在通常有三个重复;-) – 2008-10-16 20:10:28

1

DES-3DES encription解密:

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; 

}}