des.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. -- require("lockbox").insecure();
  2. local Array = require("lockbox.util.array");
  3. local Bit = require("lockbox.util.bit");
  4. local Math = require("math");
  5. local AND = Bit.band;
  6. local OR = Bit.bor;
  7. local XOR = Bit.bxor;
  8. local LSHIFT = Bit.lshift;
  9. local RSHIFT = Bit.rshift;
  10. local IN_P = {
  11. 58, 50, 42, 34, 26, 18, 10, 2,
  12. 60, 52, 44, 36, 28, 20, 12, 4,
  13. 62, 54, 46, 38, 30, 22, 14, 6,
  14. 64, 56, 48, 40, 32, 24, 16, 8,
  15. 57, 49, 41, 33, 25, 17, 9, 1,
  16. 59, 51, 43, 35, 27, 19, 11, 3,
  17. 61, 53, 45, 37, 29, 21, 13, 5,
  18. 63, 55, 47, 39, 31, 23, 15, 7};
  19. local OUT_P = {
  20. 40, 8, 48, 16, 56, 24, 64, 32,
  21. 39, 7, 47, 15, 55, 23, 63, 31,
  22. 38, 6, 46, 14, 54, 22, 62, 30,
  23. 37, 5, 45, 13, 53, 21, 61, 29,
  24. 36, 4, 44, 12, 52, 20, 60, 28,
  25. 35, 3, 43, 11, 51, 19, 59, 27,
  26. 34, 2, 42, 10, 50, 18, 58, 26,
  27. 33, 1, 41, 9, 49, 17, 57, 25};
  28. -- add 32 to each because we do the expansion on the full LR table, not just R
  29. local EBIT = {
  30. 32 + 32, 1 + 32, 2 + 32, 3 + 32, 4 + 32, 5 + 32, 4 + 32, 5 + 32, 6 + 32, 7 + 32, 8 + 32, 9 + 32,
  31. 8 + 32, 9 + 32, 10 + 32, 11 + 32, 12 + 32, 13 + 32, 12 + 32, 13 + 32, 14 + 32, 15 + 32, 16 + 32, 17 + 32,
  32. 16 + 32, 17 + 32, 18 + 32, 19 + 32, 20 + 32, 21 + 32, 20 + 32, 21 + 32, 22 + 32, 23 + 32, 24 + 32, 25 + 32,
  33. 24 + 32, 25 + 32, 26 + 32, 27 + 32, 28 + 32, 29 + 32, 28 + 32, 29 + 32, 30 + 32, 31 + 32, 32 + 32, 1 + 32, };
  34. local LR_SWAP = {
  35. 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
  36. 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
  37. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  38. 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
  39. local PC1 = {
  40. 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
  41. 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
  42. 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
  43. 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4};
  44. local PC2 = {
  45. 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
  46. 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
  47. 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
  48. 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32};
  49. local KS1 = {
  50. 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 1,
  51. 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 29};
  52. local KS2 = KS1;
  53. local KS3 = {
  54. 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 1, 2,
  55. 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 29, 30};
  56. local KS4 = KS3;
  57. local KS5 = KS3;
  58. local KS6 = KS3;
  59. local KS7 = KS3;
  60. local KS8 = KS3;
  61. local KS9 = KS1;
  62. local KS10 = KS3;
  63. local KS11 = KS3;
  64. local KS12 = KS3;
  65. local KS13 = KS3;
  66. local KS14 = KS3;
  67. local KS15 = KS3;
  68. local KS16 = KS1;
  69. local SBOX1 = { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
  70. 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
  71. 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
  72. 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13};
  73. local SBOX2 = { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
  74. 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
  75. 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
  76. 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9};
  77. local SBOX3 = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
  78. 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
  79. 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
  80. 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12};
  81. local SBOX4 = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
  82. 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
  83. 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
  84. 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14};
  85. local SBOX5 = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
  86. 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
  87. 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
  88. 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3};
  89. local SBOX6 = { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
  90. 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
  91. 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
  92. 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13};
  93. local SBOX7 = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
  94. 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
  95. 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
  96. 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12};
  97. local SBOX8 = { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
  98. 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
  99. 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
  100. 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11};
  101. local ROUND_P = { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
  102. 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25};
  103. local permute = Array.permute;
  104. local unpackBytes = function(bytes)
  105. local bits = {};
  106. for _, b in pairs(bytes) do
  107. table.insert(bits, RSHIFT(AND(b, 0x80), 7));
  108. table.insert(bits, RSHIFT(AND(b, 0x40), 6));
  109. table.insert(bits, RSHIFT(AND(b, 0x20), 5));
  110. table.insert(bits, RSHIFT(AND(b, 0x10), 4));
  111. table.insert(bits, RSHIFT(AND(b, 0x08), 3));
  112. table.insert(bits, RSHIFT(AND(b, 0x04), 2));
  113. table.insert(bits, RSHIFT(AND(b, 0x02), 1));
  114. table.insert(bits, AND(b, 0x01) );
  115. end
  116. return bits;
  117. end
  118. local packBytes = function(bits)
  119. local bytes = {}
  120. for k, _ in pairs(bits) do
  121. local index = Math.floor((k - 1) / 8) + 1;
  122. local shift = 7 - Math.fmod((k - 1), 8);
  123. local bit = bits[k];
  124. local byte = bytes[index];
  125. if not byte then byte = 0x00; end
  126. byte = OR(byte, LSHIFT(bit, shift));
  127. bytes[index] = byte;
  128. end
  129. return bytes;
  130. end
  131. local mix = function(LR, key)
  132. local ER = permute(LR, EBIT);
  133. for k, _ in pairs(ER) do
  134. ER[k] = XOR(ER[k], key[k]);
  135. end
  136. local FRK = {};
  137. local S = 0x00;
  138. S = OR(S, ER[1]); S = LSHIFT(S, 1);
  139. S = OR(S, ER[6]); S = LSHIFT(S, 1);
  140. S = OR(S, ER[2]); S = LSHIFT(S, 1);
  141. S = OR(S, ER[3]); S = LSHIFT(S, 1);
  142. S = OR(S, ER[4]); S = LSHIFT(S, 1);
  143. S = OR(S, ER[5]); S = S + 1;
  144. S = SBOX1[S];
  145. FRK[1] = RSHIFT(AND(S, 0x08), 3);
  146. FRK[2] = RSHIFT(AND(S, 0x04), 2);
  147. FRK[3] = RSHIFT(AND(S, 0x02), 1);
  148. FRK[4] = AND(S, 0x01);
  149. S = 0x00;
  150. S = OR(S, ER[1 + 6]); S = LSHIFT(S, 1);
  151. S = OR(S, ER[6 + 6]); S = LSHIFT(S, 1);
  152. S = OR(S, ER[2 + 6]); S = LSHIFT(S, 1);
  153. S = OR(S, ER[3 + 6]); S = LSHIFT(S, 1);
  154. S = OR(S, ER[4 + 6]); S = LSHIFT(S, 1);
  155. S = OR(S, ER[5 + 6]); S = S + 1;
  156. S = SBOX2[S];
  157. FRK[5] = RSHIFT(AND(S, 0x08), 3);
  158. FRK[6] = RSHIFT(AND(S, 0x04), 2);
  159. FRK[7] = RSHIFT(AND(S, 0x02), 1);
  160. FRK[8] = AND(S, 0x01);
  161. S = 0x00;
  162. S = OR(S, ER[1 + 12]); S = LSHIFT(S, 1);
  163. S = OR(S, ER[6 + 12]); S = LSHIFT(S, 1);
  164. S = OR(S, ER[2 + 12]); S = LSHIFT(S, 1);
  165. S = OR(S, ER[3 + 12]); S = LSHIFT(S, 1);
  166. S = OR(S, ER[4 + 12]); S = LSHIFT(S, 1);
  167. S = OR(S, ER[5 + 12]); S = S + 1;
  168. S = SBOX3[S];
  169. FRK[9] = RSHIFT(AND(S, 0x08), 3);
  170. FRK[10] = RSHIFT(AND(S, 0x04), 2);
  171. FRK[11] = RSHIFT(AND(S, 0x02), 1);
  172. FRK[12] = AND(S, 0x01);
  173. S = 0x00;
  174. S = OR(S, ER[1 + 18]); S = LSHIFT(S, 1);
  175. S = OR(S, ER[6 + 18]); S = LSHIFT(S, 1);
  176. S = OR(S, ER[2 + 18]); S = LSHIFT(S, 1);
  177. S = OR(S, ER[3 + 18]); S = LSHIFT(S, 1);
  178. S = OR(S, ER[4 + 18]); S = LSHIFT(S, 1);
  179. S = OR(S, ER[5 + 18]); S = S + 1;
  180. S = SBOX4[S];
  181. FRK[13] = RSHIFT(AND(S, 0x08), 3);
  182. FRK[14] = RSHIFT(AND(S, 0x04), 2);
  183. FRK[15] = RSHIFT(AND(S, 0x02), 1);
  184. FRK[16] = AND(S, 0x01);
  185. S = 0x00;
  186. S = OR(S, ER[1 + 24]); S = LSHIFT(S, 1);
  187. S = OR(S, ER[6 + 24]); S = LSHIFT(S, 1);
  188. S = OR(S, ER[2 + 24]); S = LSHIFT(S, 1);
  189. S = OR(S, ER[3 + 24]); S = LSHIFT(S, 1);
  190. S = OR(S, ER[4 + 24]); S = LSHIFT(S, 1);
  191. S = OR(S, ER[5 + 24]); S = S + 1;
  192. S = SBOX5[S];
  193. FRK[17] = RSHIFT(AND(S, 0x08), 3);
  194. FRK[18] = RSHIFT(AND(S, 0x04), 2);
  195. FRK[19] = RSHIFT(AND(S, 0x02), 1);
  196. FRK[20] = AND(S, 0x01);
  197. S = 0x00;
  198. S = OR(S, ER[1 + 30]); S = LSHIFT(S, 1);
  199. S = OR(S, ER[6 + 30]); S = LSHIFT(S, 1);
  200. S = OR(S, ER[2 + 30]); S = LSHIFT(S, 1);
  201. S = OR(S, ER[3 + 30]); S = LSHIFT(S, 1);
  202. S = OR(S, ER[4 + 30]); S = LSHIFT(S, 1);
  203. S = OR(S, ER[5 + 30]); S = S + 1;
  204. S = SBOX6[S];
  205. FRK[21] = RSHIFT(AND(S, 0x08), 3);
  206. FRK[22] = RSHIFT(AND(S, 0x04), 2);
  207. FRK[23] = RSHIFT(AND(S, 0x02), 1);
  208. FRK[24] = AND(S, 0x01);
  209. S = 0x00;
  210. S = OR(S, ER[1 + 36]); S = LSHIFT(S, 1);
  211. S = OR(S, ER[6 + 36]); S = LSHIFT(S, 1);
  212. S = OR(S, ER[2 + 36]); S = LSHIFT(S, 1);
  213. S = OR(S, ER[3 + 36]); S = LSHIFT(S, 1);
  214. S = OR(S, ER[4 + 36]); S = LSHIFT(S, 1);
  215. S = OR(S, ER[5 + 36]); S = S + 1;
  216. S = SBOX7[S];
  217. FRK[25] = RSHIFT(AND(S, 0x08), 3);
  218. FRK[26] = RSHIFT(AND(S, 0x04), 2);
  219. FRK[27] = RSHIFT(AND(S, 0x02), 1);
  220. FRK[28] = AND(S, 0x01);
  221. S = 0x00;
  222. S = OR(S, ER[1 + 42]); S = LSHIFT(S, 1);
  223. S = OR(S, ER[6 + 42]); S = LSHIFT(S, 1);
  224. S = OR(S, ER[2 + 42]); S = LSHIFT(S, 1);
  225. S = OR(S, ER[3 + 42]); S = LSHIFT(S, 1);
  226. S = OR(S, ER[4 + 42]); S = LSHIFT(S, 1);
  227. S = OR(S, ER[5 + 42]); S = S + 1;
  228. S = SBOX8[S];
  229. FRK[29] = RSHIFT(AND(S, 0x08), 3);
  230. FRK[30] = RSHIFT(AND(S, 0x04), 2);
  231. FRK[31] = RSHIFT(AND(S, 0x02), 1);
  232. FRK[32] = AND(S, 0x01);
  233. FRK = permute(FRK, ROUND_P);
  234. return FRK;
  235. end
  236. local DES = {};
  237. DES.blockSize = 8;
  238. DES.encrypt = function(keyBlock, inputBlock)
  239. local LR = unpackBytes(inputBlock);
  240. local keyBits = unpackBytes(keyBlock);
  241. local CD = permute(keyBits, PC1);
  242. --key schedule
  243. CD = permute(CD, KS1); local KEY1 = permute(CD, PC2);
  244. CD = permute(CD, KS2); local KEY2 = permute(CD, PC2);
  245. CD = permute(CD, KS3); local KEY3 = permute(CD, PC2);
  246. CD = permute(CD, KS4); local KEY4 = permute(CD, PC2);
  247. CD = permute(CD, KS5); local KEY5 = permute(CD, PC2);
  248. CD = permute(CD, KS6); local KEY6 = permute(CD, PC2);
  249. CD = permute(CD, KS7); local KEY7 = permute(CD, PC2);
  250. CD = permute(CD, KS8); local KEY8 = permute(CD, PC2);
  251. CD = permute(CD, KS9); local KEY9 = permute(CD, PC2);
  252. CD = permute(CD, KS10); local KEY10 = permute(CD, PC2);
  253. CD = permute(CD, KS11); local KEY11 = permute(CD, PC2);
  254. CD = permute(CD, KS12); local KEY12 = permute(CD, PC2);
  255. CD = permute(CD, KS13); local KEY13 = permute(CD, PC2);
  256. CD = permute(CD, KS14); local KEY14 = permute(CD, PC2);
  257. CD = permute(CD, KS15); local KEY15 = permute(CD, PC2);
  258. CD = permute(CD, KS16); local KEY16 = permute(CD, PC2);
  259. --input permutation
  260. LR = permute(LR, IN_P);
  261. --rounds
  262. local frk = mix(LR, KEY1);
  263. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  264. LR = permute(LR, LR_SWAP);
  265. frk = mix(LR, KEY2);
  266. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  267. LR = permute(LR, LR_SWAP);
  268. frk = mix(LR, KEY3);
  269. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  270. LR = permute(LR, LR_SWAP);
  271. frk = mix(LR, KEY4);
  272. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  273. LR = permute(LR, LR_SWAP);
  274. frk = mix(LR, KEY5);
  275. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  276. LR = permute(LR, LR_SWAP);
  277. frk = mix(LR, KEY6);
  278. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  279. LR = permute(LR, LR_SWAP);
  280. frk = mix(LR, KEY7);
  281. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  282. LR = permute(LR, LR_SWAP);
  283. frk = mix(LR, KEY8);
  284. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  285. LR = permute(LR, LR_SWAP);
  286. frk = mix(LR, KEY9);
  287. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  288. LR = permute(LR, LR_SWAP);
  289. frk = mix(LR, KEY10);
  290. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  291. LR = permute(LR, LR_SWAP);
  292. frk = mix(LR, KEY11);
  293. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  294. LR = permute(LR, LR_SWAP);
  295. frk = mix(LR, KEY12);
  296. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  297. LR = permute(LR, LR_SWAP);
  298. frk = mix(LR, KEY13);
  299. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  300. LR = permute(LR, LR_SWAP);
  301. frk = mix(LR, KEY14);
  302. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  303. LR = permute(LR, LR_SWAP);
  304. frk = mix(LR, KEY15);
  305. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  306. LR = permute(LR, LR_SWAP);
  307. frk = mix(LR, KEY16);
  308. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  309. --output permutation
  310. LR = permute(LR, OUT_P);
  311. local outputBlock = packBytes(LR);
  312. return outputBlock;
  313. end
  314. DES.decrypt = function(keyBlock, inputBlock)
  315. local LR = unpackBytes(inputBlock);
  316. local keyBits = unpackBytes(keyBlock);
  317. local CD = permute(keyBits, PC1);
  318. --key schedule
  319. CD = permute(CD, KS1); local KEY1 = permute(CD, PC2);
  320. CD = permute(CD, KS2); local KEY2 = permute(CD, PC2);
  321. CD = permute(CD, KS3); local KEY3 = permute(CD, PC2);
  322. CD = permute(CD, KS4); local KEY4 = permute(CD, PC2);
  323. CD = permute(CD, KS5); local KEY5 = permute(CD, PC2);
  324. CD = permute(CD, KS6); local KEY6 = permute(CD, PC2);
  325. CD = permute(CD, KS7); local KEY7 = permute(CD, PC2);
  326. CD = permute(CD, KS8); local KEY8 = permute(CD, PC2);
  327. CD = permute(CD, KS9); local KEY9 = permute(CD, PC2);
  328. CD = permute(CD, KS10); local KEY10 = permute(CD, PC2);
  329. CD = permute(CD, KS11); local KEY11 = permute(CD, PC2);
  330. CD = permute(CD, KS12); local KEY12 = permute(CD, PC2);
  331. CD = permute(CD, KS13); local KEY13 = permute(CD, PC2);
  332. CD = permute(CD, KS14); local KEY14 = permute(CD, PC2);
  333. CD = permute(CD, KS15); local KEY15 = permute(CD, PC2);
  334. CD = permute(CD, KS16); local KEY16 = permute(CD, PC2);
  335. --input permutation
  336. LR = permute(LR, IN_P);
  337. --rounds
  338. local frk = mix(LR, KEY16);
  339. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  340. LR = permute(LR, LR_SWAP);
  341. frk = mix(LR, KEY15);
  342. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  343. LR = permute(LR, LR_SWAP);
  344. frk = mix(LR, KEY14);
  345. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  346. LR = permute(LR, LR_SWAP);
  347. frk = mix(LR, KEY13);
  348. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  349. LR = permute(LR, LR_SWAP);
  350. frk = mix(LR, KEY12);
  351. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  352. LR = permute(LR, LR_SWAP);
  353. frk = mix(LR, KEY11);
  354. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  355. LR = permute(LR, LR_SWAP);
  356. frk = mix(LR, KEY10);
  357. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  358. LR = permute(LR, LR_SWAP);
  359. frk = mix(LR, KEY9);
  360. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  361. LR = permute(LR, LR_SWAP);
  362. frk = mix(LR, KEY8);
  363. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  364. LR = permute(LR, LR_SWAP);
  365. frk = mix(LR, KEY7);
  366. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  367. LR = permute(LR, LR_SWAP);
  368. frk = mix(LR, KEY6);
  369. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  370. LR = permute(LR, LR_SWAP);
  371. frk = mix(LR, KEY5);
  372. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  373. LR = permute(LR, LR_SWAP);
  374. frk = mix(LR, KEY4);
  375. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  376. LR = permute(LR, LR_SWAP);
  377. frk = mix(LR, KEY3);
  378. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  379. LR = permute(LR, LR_SWAP);
  380. frk = mix(LR, KEY2);
  381. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  382. LR = permute(LR, LR_SWAP);
  383. frk = mix(LR, KEY1);
  384. for k, _ in pairs(frk) do LR[k] = XOR(LR[k], frk[k]); end
  385. --output permutation
  386. LR = permute(LR, OUT_P);
  387. local outputBlock = packBytes(LR);
  388. return outputBlock;
  389. end
  390. return DES;