BLE_WIFI_Scale_Server_Api 服务器与wifi秤交互只需要实现3个接口:设备注册、获取用户、上传记录
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TeaUtils.java 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package com.inet.ailink.receiver.common.utils;
  2. import com.inet.ailink.receiver.common.enums.Common;
  3. import java.io.UnsupportedEncodingException;
  4. public class TeaUtils {
  5. public static byte[] encrypt(byte[] data, byte[] key) {
  6. int data_len = data.length; // 数据的长度
  7. if (data_len == 0) {
  8. return new byte[] {};
  9. }
  10. TeaUtils t = new TeaUtils();
  11. if (!t.setKey(key)) {
  12. return new byte[] {};
  13. }
  14. int group_len = 8;
  15. int residues = data_len % group_len; // 余数
  16. int dlen = data_len - residues;
  17. // 用于储存加密的密文,第一字节为余数的大小
  18. //int result_len = data_len + 1;
  19. int result_len = data_len;
  20. if (residues > 0) {
  21. result_len += group_len - residues;
  22. }
  23. byte[] result = new byte[result_len];
  24. //result[0] = (byte)residues;
  25. byte[] plain = new byte[group_len];
  26. byte[] enc = new byte[group_len];
  27. for (int i = 0; i < dlen; i += group_len) {
  28. for (int j = 0; j < group_len; j++) {
  29. plain[j] = data[i + j];
  30. }
  31. enc = t.encrypt_group(plain);
  32. for (int k = 0; k < group_len; k++) {
  33. //result[i + k + 1] = enc[k];
  34. result[i + k ] = enc[k];
  35. }
  36. }
  37. if (residues > 0) {
  38. for (int j = 0; j < residues; j++) {
  39. plain[j] = data[dlen + j];
  40. }
  41. int padding = group_len - residues;
  42. for (int j = 0; j < padding; j++) {
  43. plain[residues + j] = (byte)0x00;
  44. }
  45. enc = t.encrypt_group(plain);
  46. for (int k = 0; k < group_len; k++) {
  47. //result[dlen + k + 1] = enc[k];
  48. result[dlen + k] = enc[k];
  49. }
  50. }
  51. return result;
  52. }
  53. public static byte[] decrypt(byte[] data, byte[] key) {
  54. int group_len = 8;
  55. // if (data.length % group_len != 1) {
  56. // return new byte[] {};
  57. // }
  58. TeaUtils t = new TeaUtils();
  59. if (!t.setKey(key)) {
  60. return new byte[] {};
  61. }
  62. //int data_len = data.length - 1, dlen; // 数据的长度
  63. int data_len = data.length, dlen; // 数据的长度
  64. dlen = data_len;
  65. //int residues = (int)(data[0]); // 余数
  66. // if (residues > 0) {
  67. // dlen = data_len - group_len;
  68. // } else {
  69. // dlen = data_len;
  70. // }
  71. //byte[] result = new byte[dlen + residues];
  72. byte[] result = new byte[dlen];
  73. byte[] dec = new byte[group_len];
  74. byte[] enc = new byte[group_len];
  75. for (int i = 0; i < dlen; i += group_len) {
  76. for (int j = 0; j < group_len; j++) {
  77. //enc[j] = data[i + j + 1];
  78. enc[j] = data[i + j];
  79. }
  80. dec = t.decrypt_group(enc);
  81. for (int k = 0; k < group_len; k++) {
  82. result[i + k] = dec[k];
  83. }
  84. }
  85. // if (residues > 0) {
  86. // for (int j = 0; j < group_len; j++) {
  87. // enc[j] = data[dlen + j + 1];
  88. // }
  89. // dec = t.decrypt_group(enc);
  90. // for (int k = 0; k < residues; k++) {
  91. // result[dlen + k] = dec[k];
  92. // }
  93. // }
  94. return result;
  95. }
  96. /**
  97. * 设置密钥
  98. * @param k 密钥
  99. * @return 密钥长度为16个byte时, 设置密钥并返回true,否则返回false
  100. */
  101. public boolean setKey(byte[] k) {
  102. if(k==null){
  103. k = Common.TEA_KEY;
  104. }
  105. if (k.length != 16) {
  106. return false;
  107. }
  108. k0 = bytes_to_uint32(new byte[] {k[0], k[1], k[2], k[3]});
  109. k1 = bytes_to_uint32(new byte[] {k[4], k[5], k[6], k[7]});
  110. k2 = bytes_to_uint32(new byte[] {k[8], k[9], k[10], k[11]});
  111. k3 = bytes_to_uint32(new byte[] {k[12], k[13], k[14], k[15]});
  112. return true;
  113. }
  114. /**
  115. * 设置加密的轮数,默认为32轮
  116. * @param loops 加密轮数
  117. * @return 轮数为16、32、64时,返回true,否则返回false
  118. */
  119. public boolean setLoops(int loops) {
  120. switch (loops) {
  121. case 16:
  122. case 32:
  123. case 64:
  124. this.loops = loops;
  125. return true;
  126. }
  127. return false;
  128. }
  129. private static long UINT32_MAX = 0xFFFFFFFFL;
  130. private static long BYTE_1 = 0xFFL;
  131. private static long BYTE_2 = 0xFF00L;
  132. private static long BYTE_3 = 0xFF0000L;
  133. private static long BYTE_4 = 0xFF000000L;
  134. private static long delta = 0x9E3779B9L;
  135. private static long k0;
  136. private static long k1;
  137. private static long k2;
  138. private static long k3;
  139. private static int loops = 32;
  140. /**
  141. * 加密一组明文
  142. * @param v 需要加密的明文
  143. * @return 返回密文
  144. */
  145. public static byte[] encrypt_group(byte[] v) {
  146. long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]});
  147. long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]});
  148. long sum = 0L;
  149. long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L;
  150. long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L;
  151. for (int i = 0; i < loops; i++) {
  152. sum = toUInt32(sum + delta);
  153. v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0);
  154. v0_xor_2 = toUInt32(v1 + sum);
  155. v0_xor_3 = toUInt32((v1 >> 5) + k1);
  156. v0 = toUInt32( v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3) );
  157. v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2);
  158. v1_xor_2 = toUInt32(v0 + sum);
  159. v1_xor_3 = toUInt32((v0 >> 5) + k3);
  160. //System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3);
  161. v1 = toUInt32( v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3) );
  162. }
  163. byte[] b0 = long_to_bytes(v0, 4);
  164. byte[] b1 = long_to_bytes(v1, 4);
  165. return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]};
  166. }
  167. /**
  168. * 解密一组密文
  169. * @param v 要解密的密文
  170. * @return 返回明文
  171. */
  172. public static byte[] decrypt_group(byte[] v) {
  173. long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]});
  174. long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]});
  175. long sum = 0xC6EF3720L, tmp = 0L;
  176. for (int i = 0; i < loops; i++) {
  177. tmp = toUInt32(toUInt32(v0 << 4) + k2);
  178. v1 = toUInt32( v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3)) );
  179. tmp = toUInt32(toUInt32(v1 << 4) + k0);
  180. v0 = toUInt32( v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1)) );
  181. sum = toUInt32(sum - delta);
  182. }
  183. byte[] b0 = long_to_bytes(v0, 4);
  184. byte[] b1 = long_to_bytes(v1, 4);
  185. return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]};
  186. }
  187. /**
  188. * 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte
  189. * @param n 需要转换的long
  190. * @param len 若为4,则只返回低32位的4个byte,否则返回8个byte
  191. * @return 转换后byte数组
  192. */
  193. private static byte[] long_to_bytes(long n, int len) {
  194. byte a = (byte)((n & BYTE_4) >> 24);
  195. byte b = (byte)((n & BYTE_3) >> 16);
  196. byte c = (byte)((n & BYTE_2) >> 8);
  197. byte d = (byte)(n & BYTE_1);
  198. if (len == 4) {
  199. return new byte[] {a, b, c, d};
  200. }
  201. byte ha = (byte)(n >> 56);
  202. byte hb = (byte)((n >> 48) & BYTE_1);
  203. byte hc = (byte)((n >> 40) & BYTE_1);
  204. byte hd = (byte)((n >> 32) & BYTE_1);
  205. return new byte[] {ha, hb, hc, hd, a, b, c, d};
  206. }
  207. /**
  208. * 将4个byte转为 Unsigned Integer 32,以 long 形式返回
  209. * @param bs 需要转换的字节
  210. * @return 返回 long,高32位为0,低32位视为Unsigned Integer
  211. */
  212. private static long bytes_to_uint32(byte[] bs) {
  213. return ((bs[0]<<24) & BYTE_4) +
  214. ((bs[1]<<16) & BYTE_3) +
  215. ((bs[2]<<8) & BYTE_2) +
  216. (bs[3] & BYTE_1);
  217. }
  218. /**
  219. * 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer
  220. * @param n 需要清除的long
  221. * @return 返回高32位全为0的long
  222. */
  223. private static long toUInt32(long n) {
  224. return n & UINT32_MAX;
  225. }
  226. public static void main(String args[]) throws UnsupportedEncodingException
  227. {
  228. TeaUtils t = new TeaUtils();
  229. t.setKey(Common.TEA_KEY);
  230. byte[] old = new byte[]{(byte)0x01,(byte)0x16,(byte)0xA4,(byte)0x28,
  231. (byte)0x32,(byte)0x18,(byte)0x4A,(byte)0x88,
  232. (byte)0x00,(byte)0x00 ,(byte)0x00 ,(byte)0x00,
  233. (byte)0x00 ,(byte)0x00 ,(byte)0x42 ,(byte)0x4D,
  234. (byte)0x10 ,(byte)0x01,(byte)0x0A ,(byte)0x00,
  235. (byte)0x13 ,(byte)0x05 ,(byte)0x07 ,(byte)0xC8};
  236. /*byte[] old = new byte[] {
  237. 0x00, 0x00, 0x00, 0x20,
  238. 0x00, 0x00, 0x00, 0x10
  239. };*/
  240. byte[] enc = t.encrypt(old,Common.TEA_KEY);
  241. System.out.println( "tea加密:");
  242. for(byte i : enc)
  243. System.out.print(i + " ");
  244. System.out.println();
  245. byte[] dec = t.decrypt(enc,Common.TEA_KEY);
  246. System.out.println( "tea解密:");
  247. for(byte i : dec)
  248. System.out.print(i + " ");
  249. System.out.println();
  250. }
  251. }