des3.lua 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. -- require("lockbox").insecure();
  2. local Array = require("lockbox.util.array");
  3. local DES = require("lockbox.cipher.des");
  4. local DES3 = {};
  5. local getKeys = function(keyBlock)
  6. local size = Array.size(keyBlock)
  7. local key1;
  8. local key2;
  9. local key3;
  10. if (size == 8) then
  11. key1 = keyBlock;
  12. key2 = keyBlock;
  13. key3 = keyBlock;
  14. elseif (size == 16) then
  15. key1 = Array.slice(keyBlock, 1, 8);
  16. key2 = Array.slice(keyBlock, 9, 16);
  17. key3 = key1;
  18. elseif (size == 24) then
  19. key1 = Array.slice(keyBlock, 1, 8);
  20. key2 = Array.slice(keyBlock, 9, 16);
  21. key3 = Array.slice(keyBlock, 17, 24);
  22. else
  23. assert(false, "Invalid key size for 3DES");
  24. end
  25. return key1, key2, key3;
  26. end
  27. DES3.blockSize = DES.blockSize;
  28. DES3.encrypt = function(keyBlock, inputBlock)
  29. local key1;
  30. local key2;
  31. local key3;
  32. key1, key2, key3 = getKeys(keyBlock);
  33. local block = inputBlock;
  34. block = DES.encrypt(key1, block);
  35. block = DES.decrypt(key2, block);
  36. block = DES.encrypt(key3, block);
  37. return block;
  38. end
  39. DES3.decrypt = function(keyBlock, inputBlock)
  40. local key1;
  41. local key2;
  42. local key3;
  43. key1, key2, key3 = getKeys(keyBlock);
  44. local block = inputBlock;
  45. block = DES.decrypt(key3, block);
  46. block = DES.encrypt(key2, block);
  47. block = DES.decrypt(key1, block);
  48. return block;
  49. end
  50. return DES3;