des.lua 17 KB

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