des3encryption.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "des3encryption.h"
  2. #include <openssl/des.h>
  3. Des3Encryption::Des3Encryption() {}
  4. QByteArray Des3Encryption::pkcs7Padding(const QByteArray& data, int blockSize) {
  5. int padding = blockSize - (data.size() % blockSize);
  6. QByteArray paddedData = data;
  7. paddedData.append(QByteArray(padding, static_cast<char>(padding)));
  8. return paddedData;
  9. }
  10. // PKCS#7 去填充函数
  11. QByteArray Des3Encryption::pkcs7Unpadding(const QByteArray& data) {
  12. if (data.isEmpty()) {
  13. return data;
  14. }
  15. int padding = static_cast<unsigned char>(data[data.size() - 1]);
  16. if (padding > data.size()) {
  17. return data;
  18. }
  19. return data.left(data.size() - padding);
  20. }
  21. // DES 加密函数
  22. QByteArray Des3Encryption::desEncrypt(const QByteArray& data, const QByteArray& key) {
  23. DES_cblock desKey;
  24. memcpy(desKey, key.constData(), 8);
  25. DES_key_schedule schedule;
  26. DES_set_key(&desKey, &schedule);
  27. QByteArray encryptedData;
  28. for (int i = 0; i < data.size(); i += 8) {
  29. DES_cblock inputBlock;
  30. memcpy(inputBlock, data.constData() + i, 8);
  31. DES_cblock outputBlock;
  32. DES_ecb_encrypt(&inputBlock, &outputBlock, &schedule, DES_ENCRYPT);
  33. encryptedData.append(reinterpret_cast<const char*>(outputBlock), 8);
  34. }
  35. return encryptedData;
  36. }
  37. // DES 解密函数
  38. QByteArray Des3Encryption::desDecrypt(const QByteArray& data, const QByteArray& key) {
  39. DES_cblock desKey;
  40. memcpy(desKey, key.constData(), 8);
  41. DES_key_schedule schedule;
  42. DES_set_key(&desKey, &schedule);
  43. QByteArray decryptedData;
  44. for (int i = 0; i < data.size(); i += 8) {
  45. DES_cblock inputBlock;
  46. memcpy(inputBlock, data.constData() + i, 8);
  47. DES_cblock outputBlock;
  48. DES_ecb_encrypt(&inputBlock, &outputBlock, &schedule, DES_DECRYPT);
  49. decryptedData.append(reinterpret_cast<const char*>(outputBlock), 8);
  50. }
  51. return decryptedData;
  52. }
  53. // 3DES 加密函数
  54. QByteArray Des3Encryption::des3Encrypt(const QByteArray& data, const QByteArray& key) {
  55. // 将密钥填充到 24 字节
  56. QByteArray paddedKey = key.leftJustified(24, '\0');
  57. // 对数据进行 PKCS#7 填充
  58. QByteArray paddedData = pkcs7Padding(data, 8);
  59. QByteArray k1 = paddedKey.mid(0, 8);
  60. QByteArray k2 = paddedKey.mid(8, 8);
  61. QByteArray k3 = paddedKey.mid(16, 8);
  62. QByteArray temp1 = desEncrypt(paddedData, k1);
  63. QByteArray temp2 = desDecrypt(temp1, k2);
  64. QByteArray encrypted = desEncrypt(temp2, k3);
  65. return encrypted;
  66. }
  67. // 3DES 解密函数
  68. QByteArray Des3Encryption::des3Decrypt(const QByteArray& data, const QByteArray& key) {
  69. // 将密钥填充到 24 字节
  70. QByteArray paddedKey = key.leftJustified(24, '\0');
  71. QByteArray k1 = paddedKey.mid(0, 8);
  72. QByteArray k2 = paddedKey.mid(8, 8);
  73. QByteArray k3 = paddedKey.mid(16, 8);
  74. QByteArray temp1 = desDecrypt(data, k3);
  75. QByteArray temp2 = desEncrypt(temp1, k2);
  76. QByteArray decrypted = desDecrypt(temp2, k1);
  77. return pkcs7Unpadding(decrypted);
  78. }