天天看點

Java分組密碼算法DES

1 實驗内容 掌握分組密碼算法DES方法,能用進階語言實作分組密碼算法DES。DES算法為密碼體制中的對稱密碼體制,又被成為美國資料加密标準,是1972年美國IBM公司研制的對稱密碼體制加密算法。 明文按64位進行分組, 密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位, 使得每個密鑰都有奇數個1)分組後的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。 2   分組密碼算法DES算法的基本原理 其入口參數有三個:key、data、mode。 key為加密解密使用的密鑰,data為加密  des算法結構解密的資料,mode為其工作模式。當模式為加密模式時,明文按照64位進行分組,形成明文組,key用于對資料加密,當模式為解密模式時,key用于對資料解密。實際運用中,密鑰隻用到了64位中的56位,這樣才具有高的安全性 2.1  分組密碼算法DES算法概述 2.2  分組密碼算法DES算法流程 DES算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位,整個算法  des算法流程圖的主流程圖如下

Java分組密碼算法DES
3 . 實驗結果
Java分組密碼算法DES

全部源代碼下載下傳:

http://down.51cto.com/data/433704

部分源代碼:

//密鑰

  1. public class GetSubKey { 
  2.     private String inKey; 
  3.     private StringBuffer keyBuf; 
  4.     private byte[] key = new byte[64]; // 儲存密鑰的64位二進制表示 
  5.     private byte[] kwork = new byte[56]; 
  6.     private static byte[] shift = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 
  7.             2, 1 }; 
  8.     protected byte[] k1 = new byte[48]; 
  9.     protected byte[] k2 = new byte[48]; 
  10.     protected byte[] k3 = new byte[48]; 
  11.     protected byte[] k4 = new byte[48]; 
  12.     protected byte[] k5 = new byte[48]; 
  13.     protected byte[] k6 = new byte[48]; 
  14.     protected byte[] k7 = new byte[48]; 
  15.     protected byte[] k8 = new byte[48]; 
  16.     protected byte[] k9 = new byte[48]; 
  17.     protected byte[] k10 = new byte[48]; 
  18.     protected byte[] k11 = new byte[48]; 
  19.     protected byte[] k12 = new byte[48]; 
  20.     protected byte[] k13 = new byte[48]; 
  21.     protected byte[] k14 = new byte[48]; 
  22.     protected byte[] k15 = new byte[48]; 
  23.     protected byte[] k16 = new byte[48]; 
  24.     protected byte[] kn = new byte[48]; 
  25.     public GetSubKey(String inKey) { 
  26.         byte j; 
  27.         this.inKey = inKey; 
  28.         int len = inKey.length(); 
  29.         keyBuf = new StringBuffer(inKey); 
  30.         if (len < 8) { // 密鑰必須是8位,若小于8位不夠的補空格 ,大于8位取前8位 
  31.             for (int i = 1; i <= 8 - len; i++) 
  32.                 keyBuf.append("?"); 
  33.         } 
  34.         inKey = keyBuf.toString(); 
  35.         // 将8個字元的密鑰轉換成64位二進制表示 
  36.         for (int i = 0; i < 8; i++) { 
  37.             j = (byte) (inKey.charAt(i)); 
  38.             key[8 * i] = (byte) ((j / 128) % 2); 
  39.             key[8 * i + 1] = (byte) ((j / 64) % 2); 
  40.             key[8 * i + 2] = (byte) ((j / 32) % 2); 
  41.             key[8 * i + 3] = (byte) ((j / 16) % 2); 
  42.             key[8 * i + 4] = (byte) ((j / 8) % 2); 
  43.             key[8 * i + 5] = (byte) ((j / 4) % 2); 
  44.             key[8 * i + 6] = (byte) ((j / 2) % 2); 
  45.             key[8 * i + 7] = (byte) (j % 2); 
  46.         } 
  47.         // 初始化鍵的排列順序 
  48.         kwork[0] = key[56]; 
  49.         kwork[1] = key[48]; 
  50.         kwork[2] = key[40]; 
  51.         kwork[3] = key[32]; 
  52.         kwork[4] = key[24]; 
  53.         kwork[5] = key[16]; 
  54.         kwork[6] = key[8]; 
  55.         kwork[7] = key[0]; 
  56.         kwork[8] = key[57]; 
  57.         kwork[9] = key[49]; 
  58.         kwork[10] = key[41]; 
  59.         kwork[11] = key[33]; 
  60.         kwork[12] = key[25]; 
  61.         kwork[13] = key[17]; 
  62.         kwork[14] = key[9]; 
  63.         kwork[15] = key[1]; 
  64.         kwork[16] = key[58]; 
  65.         kwork[17] = key[50]; 
  66.         kwork[18] = key[42]; 
  67.         kwork[19] = key[34]; 
  68.         kwork[20] = key[26]; 
  69.         kwork[21] = key[18]; 
  70.         kwork[22] = key[10]; 
  71.         kwork[23] = key[2]; 
  72.         kwork[24] = key[59]; 
  73.         kwork[25] = key[51]; 
  74.         kwork[26] = key[43]; 
  75.         kwork[27] = key[35]; 
  76.         kwork[28] = key[62]; 
  77.         kwork[29] = key[54]; 
  78.         kwork[30] = key[46]; 
  79.         kwork[31] = key[38]; 
  80.         kwork[32] = key[30]; 
  81.         kwork[33] = key[22]; 
  82.         kwork[34] = key[14]; 
  83.         kwork[35] = key[6]; 
  84.         kwork[36] = key[61]; 
  85.         kwork[37] = key[53]; 
  86.         kwork[38] = key[45]; 
  87.         kwork[39] = key[37]; 
  88.         kwork[40] = key[29]; 
  89.         kwork[41] = key[21]; 
  90.         kwork[42] = key[13]; 
  91.         kwork[43] = key[5]; 
  92.         kwork[44] = key[60]; 
  93.         kwork[45] = key[52]; 
  94.         kwork[46] = key[44]; 
  95.         kwork[47] = key[36]; 
  96.         kwork[48] = key[28]; 
  97.         kwork[49] = key[20]; 
  98.         kwork[50] = key[12]; 
  99.         kwork[51] = key[4]; 
  100.         kwork[52] = key[27]; 
  101.         kwork[53] = key[19]; 
  102.         kwork[54] = key[11]; 
  103.         kwork[55] = key[3]; 
  104.         /* 開始計算子鍵 */ 
  105.         byte nbrofshift; 
  106.         byte temp1, temp2; 
  107.         for (int iter = 0; iter < 16; iter++) { 
  108.             nbrofshift = shift[iter]; 
  109.             for (int i = 0; i < (int) nbrofshift; i++) { 
  110.                 temp1 = kwork[0]; 
  111.                 temp2 = kwork[28]; 
  112.                 for (int k = 0; k < 27; k++) { 
  113.                     kwork[k] = kwork[k + 1]; 
  114.                     kwork[k + 28] = kwork[k + 29]; 
  115.                 } 
  116.                 kwork[27] = temp1; 
  117.                 kwork[55] = temp2; 
  118.             } 
  119.             /* Permute kwork - PC2 */ 
  120.             kn[0] = kwork[13]; 
  121.             kn[1] = kwork[16]; 
  122.             kn[2] = kwork[10]; 
  123.             kn[3] = kwork[23]; 
  124.             kn[4] = kwork[0]; 
  125.             kn[5] = kwork[4]; 
  126.             kn[6] = kwork[2]; 
  127.             kn[7] = kwork[27]; 
  128.             kn[8] = kwork[14]; 
  129.             kn[9] = kwork[5]; 
  130.             kn[10] = kwork[20]; 
  131.             kn[11] = kwork[9]; 
  132.             kn[12] = kwork[22]; 
  133.             kn[13] = kwork[18]; 
  134.             kn[14] = kwork[11]; 
  135.             kn[15] = kwork[3]; 
  136.             kn[16] = kwork[25]; 
  137.             kn[17] = kwork[7]; 
  138.             kn[18] = kwork[15]; 
  139.             kn[19] = kwork[6]; 
  140.             kn[20] = kwork[26]; 
  141.             kn[21] = kwork[19]; 
  142.             kn[22] = kwork[12]; 
  143.             kn[23] = kwork[1]; 
  144.             kn[24] = kwork[40]; 
  145.             kn[25] = kwork[51]; 
  146.             kn[26] = kwork[30]; 
  147.             kn[27] = kwork[36]; 
  148.             kn[28] = kwork[46]; 
  149.             kn[29] = kwork[54]; 
  150.             kn[30] = kwork[29]; 
  151.             kn[31] = kwork[39]; 
  152.             kn[32] = kwork[50]; 
  153.             kn[33] = kwork[44]; 
  154.             kn[34] = kwork[32]; 
  155.             kn[35] = kwork[47]; 
  156.             kn[36] = kwork[43]; 
  157.             kn[37] = kwork[48]; 
  158.             kn[38] = kwork[38]; 
  159.             kn[39] = kwork[55]; 
  160.             kn[40] = kwork[33]; 
  161.             kn[41] = kwork[52]; 
  162.             kn[42] = kwork[45]; 
  163.             kn[43] = kwork[41]; 
  164.             kn[44] = kwork[49]; 
  165.             kn[45] = kwork[35]; 
  166.             kn[46] = kwork[28]; 
  167.             kn[47] = kwork[31]; 
  168.             switch (iter) { 
  169.             case 0: 
  170.                 for (int k = 0; k < 48; k++) { 
  171.                     k1[k] = kn[k]; 
  172.                 } 
  173.                 break; 
  174.             case 1: 
  175.                 for (int k = 0; k < 48; k++) { 
  176.                     k2[k] = kn[k]; 
  177.                 } 
  178.                 break; 
  179.             case 2: 
  180.                 for (int k = 0; k < 48; k++) { 
  181.                     k3[k] = kn[k]; 
  182.                 } 
  183.                 break; 
  184.             case 3: 
  185.                 for (int k = 0; k < 48; k++) { 
  186.                     k4[k] = kn[k]; 
  187.                 } 
  188.                 break; 
  189.             case 4: 
  190.                 for (int k = 0; k < 48; k++) { 
  191.                     k5[k] = kn[k]; 
  192.                 } 
  193.                 break; 
  194.             case 5: 
  195.                 for (int k = 0; k < 48; k++) { 
  196.                     k6[k] = kn[k]; 
  197.                 } 
  198.                 break; 
  199.             case 6: 
  200.                 for (int k = 0; k < 48; k++) { 
  201.                     k7[k] = kn[k]; 
  202.                 } 
  203.                 break; 
  204.             case 7: 
  205.                 for (int k = 0; k < 48; k++) { 
  206.                     k8[k] = kn[k]; 
  207.                 } 
  208.                 break; 
  209.             case 8: 
  210.                 for (int k = 0; k < 48; k++) { 
  211.                     k9[k] = kn[k]; 
  212.                 } 
  213.                 break; 
  214.             case 9: 
  215.                 for (int k = 0; k < 48; k++) { 
  216.                     k10[k] = kn[k]; 
  217.                 } 
  218.                 break; 
  219.             case 10: 
  220.                 for (int k = 0; k < 48; k++) { 
  221.                     k11[k] = kn[k]; 
  222.                 } 
  223.                 break; 
  224.             case 11: 
  225.                 for (int k = 0; k < 48; k++) { 
  226.                     k12[k] = kn[k]; 
  227.                 } 
  228.                 break; 
  229.             case 12: 
  230.                 for (int k = 0; k < 48; k++) { 
  231.                     k13[k] = kn[k]; 
  232.                 } 
  233.                 break; 
  234.             case 13: 
  235.                 for (int k = 0; k < 48; k++) { 
  236.                     k14[k] = kn[k]; 
  237.                 } 
  238.                 break; 
  239.             case 14: 
  240.                 for (int k = 0; k < 48; k++) { 
  241.                     k15[k] = kn[k]; 
  242.                 } 
  243.                 break; 
  244.             case 15: 
  245.                 for (int k = 0; k < 48; k++) { 
  246.                     k16[k] = kn[k]; 
  247.                 } 
  248.                 break; 
  249.             } 
  250.         } 
  251.     }