des3encryption.cpp 2.9 KB

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