tc_des.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef __TC_DES_H
  2. #define __TC_DES_H
  3. #include <string>
  4. #include <stdint.h>
  5. #include "util/tc_ex.h"
  6. using namespace std;
  7. namespace tars
  8. {
  9. /////////////////////////////////////////////////
  10. /**
  11. * @file tc_des.h
  12. * @brief des加解密类(翻译至c代码)
  13. *
  14. * @author ruanshudong@qq.com
  15. */
  16. /////////////////////////////////////////////////
  17. /**
  18. * @brief des异常.
  19. */
  20. struct TC_DES_Exception : public TC_Exception
  21. {
  22. TC_DES_Exception(const string &buffer) : TC_Exception(buffer){};
  23. ~TC_DES_Exception() throw(){};
  24. };
  25. /**
  26. * @brief des/3des加密解密源码, 不依赖任何库.
  27. *
  28. * 在网上流行的d3des.h d3des.c修改完成.
  29. *
  30. * 对于des加密,8位密钥,不足8位的右补0x00,多余8位,只取左8位有效.
  31. *
  32. * 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,...
  33. *
  34. * 本身已8位对齐的,后面补八个0x08.
  35. *
  36. * 对于3des加解密,如下:只支持3des-ecb加密方式;
  37. *
  38. * 24位密钥,不足24位的右补0x00,多余24位,只取左24位有效;
  39. *
  40. * 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,...
  41. *
  42. * 本身已8位对齐的,后面补八个0x08.
  43. *
  44. * Key必须是null结束的字符串.
  45. *
  46. */
  47. class TC_Des
  48. {
  49. public:
  50. /**
  51. * @brief des加密.
  52. *
  53. * @param key key, 8个字节
  54. * @param sIn 输入buffer
  55. * @param iInLen 输入buffer长度
  56. * @return string 加密后的内容
  57. */
  58. static string encrypt(const char *key, const char *sIn, size_t iInlen);
  59. /**
  60. * @brief des解密.
  61. *
  62. * @param key key, 8个字节
  63. * @param sIn 输入buffer
  64. * @param iInlen 输入buffer长度
  65. * @return string 解码后的内容, 如果解密失败, 则为空
  66. */
  67. static string decrypt(const char *key, const char *sIn, size_t iInlen);
  68. /**
  69. * @brief 3des加密.
  70. *
  71. * @param key key, 24个字节
  72. * @param sIn 输入buffer
  73. * @param iInLen 输入buffer长度
  74. * @return string 加密后的内容
  75. */
  76. static string encrypt3(const char *key, const char *sIn, size_t iInlen);
  77. /**
  78. * @brief 3des解密.
  79. * @param key key, 24个字节
  80. * @param sIn 输入buffer
  81. * @param iInlen 输入buffer长度
  82. * @return string解码后的内容, 如果解密失败, 则为空
  83. */
  84. static string decrypt3(const char *key, const char *sIn, size_t iInlen);
  85. /**
  86. * @brief 定义加密/解密 .
  87. */
  88. enum
  89. {
  90. EN0 = 0, /**加密*/
  91. DE1 = 1 /**解密*/
  92. };
  93. protected:
  94. /**
  95. * @brief 获取key.
  96. *
  97. * @param key key值
  98. * @param mode 模式 :0代表加密, 1代表解密
  99. */
  100. static void deskey(const char *key, short mode, uint32_t *k);
  101. /**
  102. * @brief des加密/解密.
  103. *
  104. * @param from 8个字节
  105. * @param to 加密解密只有的8个字节
  106. */
  107. static void des(const char *from, char *to, uint32_t *KnL);
  108. /**
  109. * @brief 获取key.
  110. *
  111. * @param key key值
  112. * @param mode 模式,0代表加密, 1代表解密
  113. */
  114. static void des3key(const char *key, short mode, uint32_t *KnL, uint32_t *KnR, uint32_t *Kn3);
  115. /**
  116. * @brief 3des.
  117. *
  118. * @param from 8个字节
  119. * @param into 加密解密只有的8个字节
  120. */
  121. static void des3(const char *from, char *into, uint32_t *KnL, uint32_t *KnR, uint32_t *Kn3);
  122. private:
  123. static void cookey(register uint32_t *raw1, uint32_t *k);
  124. static void scrunch(register const char *outof, register uint32_t *into);
  125. static void unscrun(register uint32_t *outof, register char *into);
  126. static void desfunc(register uint32_t *block, register uint32_t *keys);
  127. };
  128. }
  129. #endif