Java分组密码算法DES

实验内容

掌握分组密码算法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算法流程图的主流程图如下

3. 实验结果 

 ❤Java初高级学习分享,共同学习才是最明智的选择,喜欢的话可以我的学习群64弍46衣3凌9,或加资料群69似64陆0吧3(进群备注平台名)

源代码:

  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. inKey = keyBuf.toString(); 
  34. // 将8个字符的密钥转换成64位二进制表示 
  35. for (int i = 0; i < 8; i++) { 
  36. j = (byte) (inKey.charAt(i)); 
  37. key[8 * i] = (byte) ((j / 128) % 2); 
  38. key[8 * i + 1] = (byte) ((j / 64) % 2); 
  39. key[8 * i + 2] = (byte) ((j / 32) % 2); 
  40. key[8 * i + 3] = (byte) ((j / 16) % 2); 
  41. key[8 * i + 4] = (byte) ((j / 8) % 2); 
  42. key[8 * i + 5] = (byte) ((j / 4) % 2); 
  43. key[8 * i + 6] = (byte) ((j / 2) % 2); 
  44. key[8 * i + 7] = (byte) (j % 2); 
  45. // 初始化键的排列顺序 
  46. kwork[0] = key[56]; 
  47. kwork[1] = key[48]; 
  48. kwork[2] = key[40]; 
  49. kwork[3] = key[32]; 
  50. kwork[4] = key[24]; 
  51. kwork[5] = key[16]; 
  52. kwork[6] = key[8]; 
  53. kwork[7] = key[0]; 
  54. kwork[8] = key[57]; 
  55. kwork[9] = key[49]; 
  56. kwork[10] = key[41]; 
  57. kwork[11] = key[33]; 
  58. kwork[12] = key[25]; 
  59. kwork[13] = key[17]; 
  60. kwork[14] = key[9]; 
  61. kwork[15] = key[1]; 
  62. kwork[16] = key[58]; 
  63. kwork[17] = key[50]; 
  64. kwork[18] = key[42]; 
  65. kwork[19] = key[34]; 
  66. kwork[20] = key[26]; 
  67. kwork[21] = key[18]; 
  68. kwork[22] = key[10]; 
  69. kwork[23] = key[2]; 
  70. kwork[24] = key[59]; 
  71. kwork[25] = key[51]; 
  72. kwork[26] = key[43]; 
  73. kwork[27] = key[35]; 
  74. kwork[28] = key[62]; 
  75. kwork[29] = key[54]; 
  76. kwork[30] = key[46]; 
  77. kwork[31] = key[38]; 
  78. kwork[32] = key[30]; 
  79. kwork[33] = key[22]; 
  80. kwork[34] = key[14]; 
  81. kwork[35] = key[6]; 
  82. kwork[36] = key[61]; 
  83. kwork[37] = key[53]; 
  84. kwork[38] = key[45]; 
  85. kwork[39] = key[37]; 
  86. kwork[40] = key[29]; 
  87. kwork[41] = key[21]; 
  88. kwork[42] = key[13]; 
  89. kwork[43] = key[5]; 
  90. kwork[44] = key[60]; 
  91. kwork[45] = key[52]; 
  92. kwork[46] = key[44]; 
  93. kwork[47] = key[36]; 
  94. kwork[48] = key[28]; 
  95. kwork[49] = key[20]; 
  96. kwork[50] = key[12]; 
  97. kwork[51] = key[4]; 
  98. kwork[52] = key[27]; 
  99. kwork[53] = key[19]; 
  100. kwork[54] = key[11]; 
  101. kwork[55] = key[3]; 
  102. /* 开始计算子键 */ 
  103. byte nbrofshift; 
  104. byte temp1, temp2; 
  105. for (int iter = 0; iter < 16; iter++) { 
  106. nbrofshift = shift[iter]; 
  107. for (int i = 0; i < (int) nbrofshift; i++) { 
  108. temp1 = kwork[0]; 
  109. temp2 = kwork[28]; 
  110. for (int k = 0; k < 27; k++) { 
  111. kwork[k] = kwork[k + 1]; 
  112. kwork[k + 28] = kwork[k + 29]; 
  113. kwork[27] = temp1; 
  114. kwork[55] = temp2; 
  115. /* Permute kwork - PC2 */ 
  116. kn[0] = kwork[13]; 
  117. kn[1] = kwork[16]; 
  118. kn[2] = kwork[10]; 
  119. kn[3] = kwork[23]; 
  120. kn[4] = kwork[0]; 
  121. kn[5] = kwork[4]; 
  122. kn[6] = kwork[2]; 
  123. kn[7] = kwork[27]; 
  124. kn[8] = kwork[14]; 
  125. kn[9] = kwork[5]; 
  126. kn[10] = kwork[20]; 
  127. kn[11] = kwork[9]; 
  128. kn[12] = kwork[22]; 
  129. kn[13] = kwork[18]; 
  130. kn[14] = kwork[11]; 
  131. kn[15] = kwork[3]; 
  132. kn[16] = kwork[25]; 
  133. kn[17] = kwork[7]; 
  134. kn[18] = kwork[15]; 
  135. kn[19] = kwork[6]; 
  136. kn[20] = kwork[26]; 
  137. kn[21] = kwork[19]; 
  138. kn[22] = kwork[12]; 
  139. kn[23] = kwork[1]; 
  140. kn[24] = kwork[40]; 
  141. kn[25] = kwork[51]; 
  142. kn[26] = kwork[30]; 
  143. kn[27] = kwork[36]; 
  144. kn[28] = kwork[46]; 
  145. kn[29] = kwork[54]; 
  146. kn[30] = kwork[29]; 
  147. kn[31] = kwork[39]; 
  148. kn[32] = kwork[50]; 
  149. kn[33] = kwork[44]; 
  150. kn[34] = kwork[32]; 
  151. kn[35] = kwork[47]; 
  152. kn[36] = kwork[43]; 
  153. kn[37] = kwork[48]; 
  154. kn[38] = kwork[38]; 
  155. kn[39] = kwork[55]; 
  156. kn[40] = kwork[33]; 
  157. kn[41] = kwork[52]; 
  158. kn[42] = kwork[45]; 
  159. kn[43] = kwork[41]; 
  160. kn[44] = kwork[49]; 
  161. kn[45] = kwork[35]; 
  162. kn[46] = kwork[28]; 
  163. kn[47] = kwork[31]; 
  164. switch (iter) { 
  165. case 0: 
  166. for (int k = 0; k < 48; k++) { 
  167. k1[k] = kn[k]; 
  168. break; 
  169. case 1: 
  170. for (int k = 0; k < 48; k++) { 
  171. k2[k] = kn[k]; 
  172. break; 
  173. case 2: 
  174. for (int k = 0; k < 48; k++) { 
  175. k3[k] = kn[k]; 
  176. break; 
  177. case 3: 
  178. for (int k = 0; k < 48; k++) { 
  179. k4[k] = kn[k]; 
  180. break; 
  181. case 4: 
  182. for (int k = 0; k < 48; k++) { 
  183. k5[k] = kn[k]; 
  184. break; 
  185. case 5: 
  186. for (int k = 0; k < 48; k++) { 
  187. k6[k] = kn[k]; 
  188. break; 
  189. case 6: 
  190. for (int k = 0; k < 48; k++) { 
  191. k7[k] = kn[k]; 
  192. break; 
  193. case 7: 
  194. for (int k = 0; k < 48; k++) { 
  195. k8[k] = kn[k]; 
  196. break; 
  197. case 8: 
  198. for (int k = 0; k < 48; k++) { 
  199. k9[k] = kn[k]; 
  200. break; 
  201. case 9: 
  202. for (int k = 0; k < 48; k++) { 
  203. k10[k] = kn[k]; 
  204. break; 
  205. case 10: 
  206. for (int k = 0; k < 48; k++) { 
  207. k11[k] = kn[k]; 
  208. break; 
  209. case 11: 
  210. for (int k = 0; k < 48; k++) { 
  211. k12[k] = kn[k]; 
  212. break; 
  213. case 12: 
  214. for (int k = 0; k < 48; k++) { 
  215. k13[k] = kn[k]; 
  216. break; 
  217. case 13: 
  218. for (int k = 0; k < 48; k++) { 
  219. k14[k] = kn[k]; 
  220. break; 
  221. case 14: 
  222. for (int k = 0; k < 48; k++) { 
  223. k15[k] = kn[k]; 
  224. break; 
  225. case 15: 
  226. for (int k = 0; k < 48; k++) { 
  227. k16[k] = kn[k]; 
  228. break; 

❤提问/互动请留言,可直接在最底右下方"写留言即可"

❤Java初高级学习分享,共同学习才是最明智的选择,喜欢的话可以我的学习群64弍46衣3凌9,或加资料群69似64陆0吧3(进群备注平台名)

❤如果觉得写得不错请点击“订阅”,每天更新全新的内容!

❤你们的喜欢和关注就是我最大的动力支撑!!!