encrypt_xxtea.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "encrypt_xxtea.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #define XXTEA_MX (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)
  6. #define XXTEA_DELTA 0x9E3779B9
  7. unsigned char* xxtea_encrypt(unsigned char *data, xxtea_uint data_len, unsigned char *key, xxtea_uint key_len, xxtea_uint *ret_length);
  8. unsigned char* xxtea_decrypt(unsigned char *data, xxtea_uint data_len, unsigned char *key, xxtea_uint key_len, xxtea_uint *ret_length);
  9. void xxtea_uint_encrypt(xxtea_uint *v, xxtea_uint len, xxtea_uint *k) //对整型字节流进行加密,最终处理
  10. {
  11. xxtea_uint n = len - 1;
  12. xxtea_uint z = v[n], y = v[0], p, q = 6 + 52 / (n + 1), sum = 0, e;
  13. if (n < 1)
  14. {
  15. return;
  16. }
  17. while (0 < q--)
  18. {
  19. sum += XXTEA_DELTA;
  20. e = sum >> 2 & 3;
  21. for (p = 0; p < n; p++)
  22. {
  23. y = v[p + 1];
  24. z = v[p] += XXTEA_MX;
  25. }
  26. y = v[0];
  27. z = v[n] += XXTEA_MX;
  28. }
  29. }
  30. void xxtea_uint_decrypt(xxtea_uint *v, xxtea_uint len, xxtea_uint *k) //对整型字节流进行解密,最终处理
  31. {
  32. xxtea_uint n = len - 1;
  33. xxtea_uint z = v[n], y = v[0], p, q = 6 + 52 / (n + 1), sum = q * XXTEA_DELTA, e;
  34. if (n < 1)
  35. {
  36. return;
  37. }
  38. while (sum != 0)
  39. {
  40. e = sum >> 2 & 3;
  41. for (p = n; p > 0; p--)
  42. {
  43. z = v[p - 1];
  44. y = v[p] -= XXTEA_MX;
  45. }
  46. z = v[n];
  47. y = v[0] -= XXTEA_MX;
  48. sum -= XXTEA_DELTA;
  49. }
  50. }
  51. static unsigned char* fix_key_length(unsigned char *key, xxtea_uint key_len) //如果长度不够,则进行填充
  52. {
  53. unsigned char *tmp = (unsigned char *)malloc(16); //申请16字节
  54. memcpy(tmp, key, key_len); //拷贝
  55. memset(tmp + key_len, '\0', 16 - key_len); //将多余部分置零
  56. return tmp; //返回可加密数据
  57. }
  58. static xxtea_uint* xxtea_to_uint_array(unsigned char *data, xxtea_uint len, int include_length, xxtea_uint *ret_len) //将数据转换成整型流,方便加密
  59. {
  60. xxtea_uint i, n, *result;
  61. n = len >> 2; //右移2位,相当与*2
  62. n = (((len & 3) == 0) ? n : n + 1); //与运算,问号表达
  63. if (include_length)
  64. {
  65. result = (xxtea_uint *)malloc((n + 1) << 2);
  66. result[n] = len;
  67. *ret_len = n + 1;
  68. } else
  69. {
  70. result = (xxtea_uint *)malloc(n << 2);
  71. *ret_len = n;
  72. }
  73. memset(result, 0, n << 2);
  74. for (i = 0; i < len; i++)
  75. {
  76. result[i >> 2] |= (xxtea_uint)data[i] << ((i & 3) << 3);
  77. }
  78. return result;
  79. }
  80. static unsigned char* xxtea_to_byte_array(xxtea_uint *data, xxtea_uint len, int include_length, xxtea_uint *ret_len) //将整型流转换成无符号字节流
  81. {
  82. xxtea_uint i, n, m;
  83. unsigned char *result;
  84. n = len << 2;
  85. if (include_length)
  86. {
  87. m = data[len - 1];
  88. if ((m < n - 7) || (m > n - 4)) return NULL;
  89. n = m;
  90. }
  91. result = (unsigned char *)malloc(n + 1);
  92. for (i = 0; i < n; i++)
  93. {
  94. result[i] = (unsigned char)((data[i >> 2] >> ((i & 3) << 3)) & 0xff);
  95. }
  96. result[n] = '\0';
  97. *ret_len = n;
  98. return result;
  99. }
  100. static unsigned char* do_xxtea_encrypt(unsigned char *data, xxtea_uint len, unsigned char *key, xxtea_uint *ret_len) //第二级初始操作(已经补位),这里数据还为字符串
  101. {
  102. unsigned char *result;
  103. xxtea_uint *v, *k, v_len, k_len;
  104. v = xxtea_to_uint_array(data, len, 1, &v_len);
  105. k = xxtea_to_uint_array(key, 16, 0, &k_len);
  106. xxtea_uint_encrypt(v, v_len, k);
  107. result = xxtea_to_byte_array(v, v_len, 0, ret_len);
  108. free(v);
  109. free(k);
  110. return result;
  111. }
  112. static unsigned char* do_xxtea_decrypt(unsigned char *data, xxtea_uint len, unsigned char *key, xxtea_uint *ret_len) //对称解密
  113. {
  114. unsigned char *result;
  115. xxtea_uint *v, *k, v_len, k_len;
  116. v = xxtea_to_uint_array(data, len, 0, &v_len); //data变成整型数组流
  117. k = xxtea_to_uint_array(key, 16, 0, &k_len); //key 变成整型数组流
  118. xxtea_uint_decrypt(v, v_len, k);
  119. result = xxtea_to_byte_array(v, v_len, 1, ret_len); //xxtea_to_byte_array(v, v_len, 0, ret_len);
  120. free(v);
  121. free(k);
  122. return result;
  123. }
  124. unsigned char* xxtea_encrypt(unsigned char *data, xxtea_uint data_len, unsigned char *key, xxtea_uint key_len, xxtea_uint *ret_length) //初始操作,加密;
  125. {
  126. unsigned char *result;
  127. *ret_length = 0;
  128. if (key_len < 16) //如果长度不够,进行补位
  129. {
  130. unsigned char *key2 = fix_key_length(key, key_len);
  131. result = do_xxtea_encrypt(data, data_len, key2, ret_length);
  132. free(key2);
  133. } else
  134. {
  135. result = do_xxtea_encrypt(data, data_len, key, ret_length);
  136. }
  137. return result;
  138. }
  139. unsigned char* xxtea_decrypt(unsigned char *data, xxtea_uint data_len, unsigned char *key, xxtea_uint key_len, xxtea_uint *ret_length) //初始操作,解密;
  140. {
  141. unsigned char *result;
  142. *ret_length = 0;
  143. if (key_len < 16) //长度不够时,补位
  144. {
  145. unsigned char *key2 = fix_key_length(key, key_len);
  146. result = do_xxtea_decrypt(data, data_len, key2, ret_length);
  147. free(key2);
  148. } else
  149. {
  150. result = do_xxtea_decrypt(data, data_len, key, ret_length);
  151. }
  152. return result;
  153. }