P100脱机下载器
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.

311 lines
14 KiB

4 years ago
  1. #include "UID_Encryption.h"
  2. /*
  3. P100: ̳µMiniproѻUIDܷΪV1.2
  4. V1.2:
  5. £
  6. ԿΪ4ֽڡ8ֽʱȡûԶ IDԽԿȷ
  7. MINI-Proѻ V1.20B ̼ʹV1.2
  8. MINIѻ V1.4A2 ̼ʹV1.2
  9. Ӱ
  10. ǰ
  11. (1).MINIѻ˹̼V1.4A2ʹMINIѻõV1.2;
  12. (2).MINI-Proѻ˹̼V1.20BʹMINIѻõV1.2;
  13. (3).ԿΪ4ֽڡ8ֽڵ
  14. (1).ԿΪ 4/8ֽʱ߼ԿԿΪ4/8ֽӰ
  15. V1.1ǰĴͬ
  16. (1).MINI-ProѻѾV1.20B̼ûԻ˵ɰ̼ʹá
  17. (2).MINIѻѾV1.4A2̼ûԻ˵ɰ̼ʹá
  18. Ӱ
  19. (1).ֻҪԿΪ12ֽھӰ
  20. V1.1:
  21. £
  22. MINIѻV1,3A5̼ʹV1.1V1.1޸V1.0
  23. UID_Encryption_Key_Check(),UID_Encryption_Key_Calculate()ʹô
  24. ģʽпֵܳڴԽ
  25. Ӱ
  26. ǰ
  27. (1).MINIѻĹ̼V1.3A5ʹMINIѻõV1.1;
  28. (2).ǰ ʹV1.3A4֮ǰ̼MINIѻ ΪģʽûʹõV1.0
  29. (1).ʹV1.3A5̼MINIѻUIDԶܹܣȻ¼V1.0û
  30. V1.1ĴģʽԿV1.0Կһ£˻оƬлֻԿ֤ͨ
  31. (1).ûеV1.0ͬµV1.1
  32. Ӱ
  33. (1).ǰʹ Сģʽ õûƷܵV1.1ԼMINIѻ̼µӰ
  34. (2).ѾʹV1.0IJƷʹIAPʽ򲻻ܵӰ
  35. (3).ѾʹV1.0IJƷʹMINIѻƷ UIDԶܹ¸ԿܵӰ
  36. ʹѻƷĻû˵UIDԶܴΪV1.1ͬʱUIDԶ¸Կ
  37. (4)MINI-Proѻװ̼ʹõV1.1ĴӰ
  38. V1.0
  39. MINIѻV1.3A4̼֮ǰĹ̼оʹV1.0Ĵ
  40. */
  41. /****************************************** UID�����㷨 start ******************************************/
  42. /* UID�����㷨0 */
  43. static void Algorithm_0(char *pCustomID, char *pUID, char KeyLength, char *pKey)
  44. {
  45. pKey[0] = (pUID[0] ^ (pCustomID[3] & pCustomID[2])) ^ pCustomID[1];
  46. pKey[1] = pCustomID[1] | (pUID[2] ^ (pCustomID[3] & pCustomID[3]));
  47. pKey[2] = (pCustomID[2] ^ pCustomID[1]) | (pUID[0] ^ pCustomID[0]);
  48. pKey[3] = ((pCustomID[3] & pCustomID[0]) ^ pCustomID[1]) | pUID[2];
  49. if(KeyLength == 8)
  50. {
  51. pKey[4] = (pUID[4] ^ (pCustomID[7] & pCustomID[5])) ^ pCustomID[5];
  52. pKey[5] = pCustomID[5] | (pUID[6] ^ (pCustomID[4] & pCustomID[7]));
  53. pKey[6] = (pCustomID[6] ^ pCustomID[5]) | (pUID[7] ^ pCustomID[4]);
  54. pKey[7] = ((pCustomID[7] & pCustomID[4]) ^ pCustomID[6]) | pUID[6];
  55. }
  56. if(KeyLength == 12)
  57. {
  58. pKey[0] = (pUID[0] ^ (pCustomID[1] & pCustomID[2])) ^ pCustomID[3];
  59. pKey[1] = pCustomID[1] | (pUID[1] ^ (pCustomID[3] & pCustomID[4]));
  60. pKey[2] = (pCustomID[2] ^ pCustomID[1]) | (pUID[2] ^ pCustomID[5]);
  61. pKey[3] = ((pCustomID[3] & pCustomID[1]) ^ pCustomID[5]) | pUID[3];
  62. pKey[4] = (pUID[4] ^ (pCustomID[5] & pCustomID[6])) ^ pCustomID[7];
  63. pKey[5] = pCustomID[5] | (pUID[5] ^ (pCustomID[7] & pCustomID[8]));
  64. pKey[6] = (pCustomID[6] ^ pCustomID[7]) | (pUID[6] ^ pCustomID[9]);
  65. pKey[7] = ((pCustomID[7] & pCustomID[8]) ^ pCustomID[9]) | pUID[7];
  66. pKey[8] = (pUID[8] ^ (pCustomID[9] & pCustomID[10])) ^ pCustomID[11];
  67. pKey[9] = pCustomID[9] | (pUID[9] ^ (pCustomID[11] & pCustomID[0]));
  68. pKey[10]= (pCustomID[10] ^ pCustomID[11]) | (pUID[0] ^ pCustomID[1]);
  69. pKey[11]= ((pCustomID[11] & pCustomID[0]) ^ pCustomID[1]) | pUID[2];
  70. }
  71. }
  72. /* UID�����㷨1 */
  73. static void Algorithm_1(char *pCustomID, char *pUID, char KeyLength, char *pKey)
  74. {
  75. pKey[0] = ((pUID[0] ^ pCustomID[1]) ^ pCustomID[2]) ^ pCustomID[3];
  76. pKey[1] = ((pCustomID[1] ^ pUID[1]) ^ pCustomID[3]) ^ pCustomID[0];
  77. pKey[2] = ((pCustomID[2] ^ pCustomID[1]) ^ pUID[2]) ^ pCustomID[3];
  78. pKey[3] = ((pCustomID[3] ^ pCustomID[1]) ^ pCustomID[0]) ^ pUID[3];
  79. if(KeyLength == 8)
  80. {
  81. pKey[4] = ((pUID[4] ^ pCustomID[5]) ^ pCustomID[6]) ^ pCustomID[7];
  82. pKey[5] = ((pCustomID[5] ^ pUID[5]) ^ pCustomID[7]) ^ pCustomID[2];
  83. pKey[6] = ((pCustomID[6] ^ pCustomID[7]) ^ pUID[6]) ^ pCustomID[3];
  84. pKey[7] = ((pCustomID[7] ^ pCustomID[4]) ^ pCustomID[5]) ^ pUID[4];
  85. }
  86. if(KeyLength == 12)
  87. {
  88. pKey[0] = ((pUID[0] ^ pCustomID[1]) ^ pCustomID[2]) ^ pCustomID[3];
  89. pKey[1] = ((pCustomID[1] ^ pUID[1]) ^ pCustomID[3]) ^ pCustomID[4];
  90. pKey[2] = ((pCustomID[2] ^ pCustomID[1]) ^ pUID[2]) ^ pCustomID[5];
  91. pKey[3] = ((pCustomID[3] ^ pCustomID[1]) ^ pCustomID[5]) ^ pUID[3];
  92. pKey[4] = ((pUID[4] ^ pCustomID[5]) ^ pCustomID[6]) ^ pCustomID[7];
  93. pKey[5] = ((pCustomID[5] ^ pUID[5]) ^ pCustomID[7]) ^ pCustomID[8];
  94. pKey[6] = ((pCustomID[6] ^ pCustomID[7]) ^ pUID[6]) ^ pCustomID[9];
  95. pKey[7] = ((pCustomID[7] ^ pCustomID[8]) ^ pCustomID[9]) ^ pUID[7];
  96. pKey[8] = ((pUID[8] ^ pCustomID[9]) ^ pCustomID[10]) ^ pCustomID[11];
  97. pKey[9] = ((pCustomID[9] ^ pUID[9]) ^ pCustomID[11]) ^ pCustomID[0];
  98. pKey[10]= ((pCustomID[10] ^ pCustomID[11]) ^ pUID[0]) ^ pCustomID[1];
  99. pKey[11]= ((pCustomID[11] ^ pCustomID[0]) ^ pCustomID[1]) ^ pUID[2];
  100. }
  101. }
  102. /* UID�����㷨2 */
  103. static void Algorithm_2(char *pCustomID, char *pUID, char KeyLength, char *pKey)
  104. {
  105. pKey[0] = ((pUID[0] & pCustomID[1]) ^ pCustomID[2]) ^ pCustomID[3];
  106. pKey[1] = (pCustomID[1] ^ (pUID[1] & pCustomID[3])) ^ pCustomID[0];
  107. pKey[2] = (pCustomID[2] | (pCustomID[1] ^ pUID[2])) | pCustomID[3];
  108. pKey[3] = (pCustomID[3] ^ pCustomID[1]) | (pCustomID[0] ^ pUID[3]);
  109. if(KeyLength == 8)
  110. {
  111. pKey[4] = (pUID[4] ^ (pCustomID[5] & pCustomID[6])) ^ pCustomID[7];
  112. pKey[5] = pCustomID[5] | (pUID[5] ^ (pCustomID[7] & pCustomID[2]));
  113. pKey[6] = ((pCustomID[6] & pCustomID[7]) ^ pUID[6]) | pCustomID[3];
  114. pKey[7] = (pCustomID[7] ^ pCustomID[4]) | (pCustomID[1] ^ pUID[2]);
  115. }
  116. if(KeyLength == 12)
  117. {
  118. pKey[0] = ((pUID[0] & pCustomID[1]) ^ pCustomID[2]) ^ pCustomID[3];
  119. pKey[1] = (pCustomID[1] ^ (pUID[1] & pCustomID[3])) ^ pCustomID[4];
  120. pKey[2] = (pCustomID[2] | (pCustomID[1] ^ pUID[2])) | pCustomID[5];
  121. pKey[3] = (pCustomID[3] ^ pCustomID[1]) | (pCustomID[5] ^ pUID[3]);
  122. pKey[4] = (pUID[4] ^ (pCustomID[5] & pCustomID[6])) ^ pCustomID[7];
  123. pKey[5] = pCustomID[5] | (pUID[5] ^ (pCustomID[7] & pCustomID[8]));
  124. pKey[6] = ((pCustomID[6] & pCustomID[7]) ^ pUID[6]) | pCustomID[9];
  125. pKey[7] = (pCustomID[7] ^ pCustomID[8]) | (pCustomID[9] ^ pUID[7]);
  126. pKey[8] = (pUID[8] ^ (pCustomID[9] & pCustomID[10])) ^ pCustomID[11];
  127. pKey[9] = (pCustomID[9] ^ pUID[9]) | (pCustomID[11] & pCustomID[0]);
  128. pKey[10]= ((pCustomID[10] & pCustomID[11]) ^ pUID[0]) ^ pCustomID[1];
  129. pKey[11]= (pCustomID[11] ^ (pCustomID[0] & pCustomID[1])) ^ pUID[2];
  130. }
  131. }
  132. /* UID�����㷨3 */
  133. static void Algorithm_3(char *pCustomID, char *pUID, char KeyLength, char *pKey)
  134. {
  135. pKey[0] = ((pUID[0] & pCustomID[1]) ^ pCustomID[2]) ^ pCustomID[3];
  136. pKey[1] = (pUID[1] ^ (pCustomID[2] & pCustomID[3])) ^ pCustomID[4];
  137. pKey[2] = (pUID[2] | (pCustomID[3] ^ pCustomID[4])) | pCustomID[5];
  138. pKey[3] = (pUID[3] ^ pCustomID[4]) | (pCustomID[5] ^ pCustomID[6]);
  139. if(KeyLength == 8)
  140. {
  141. pKey[4] = (pCustomID[4] ^ (pUID[5] & pCustomID[6])) ^ pCustomID[7];
  142. pKey[5] = pCustomID[5] | (pUID[6] ^ (pCustomID[7] & pCustomID[4]));
  143. pKey[6] = ((pCustomID[6] & pUID[7]) ^ pCustomID[6]) | pCustomID[3];
  144. pKey[7] = (pCustomID[7] ^ pUID[4]) | (pCustomID[5] ^ pCustomID[6]);
  145. }
  146. if(KeyLength == 12)
  147. {
  148. pKey[0] = ((pUID[0] & pCustomID[1]) ^ pCustomID[2]) ^ pCustomID[3];
  149. pKey[1] = (pUID[1] ^ (pCustomID[2] & pCustomID[3])) ^ pCustomID[4];
  150. pKey[2] = (pUID[2] | (pCustomID[3] ^ pCustomID[4])) | pCustomID[5];
  151. pKey[3] = (pUID[3] ^ pCustomID[4]) | (pCustomID[5] ^ pCustomID[6]);
  152. pKey[4] = (pCustomID[4] ^ (pUID[5] & pCustomID[6])) ^ pCustomID[7];
  153. pKey[5] = pCustomID[5] | (pUID[6] ^ (pCustomID[7] & pCustomID[8]));
  154. pKey[6] = ((pCustomID[6] & pUID[7]) ^ pCustomID[6]) | pCustomID[9];
  155. pKey[7] = (pCustomID[7] ^ pUID[8]) | (pCustomID[9] ^ pCustomID[10]);
  156. pKey[8] = (pCustomID[8] ^ (pCustomID[9] & pUID[10])) ^ pCustomID[11];
  157. pKey[9] = (pCustomID[9] ^ pCustomID[10]) | (pUID[11] & pCustomID[0]);
  158. pKey[10]= ((pCustomID[10] & pCustomID[11]) ^ pUID[0]) ^ pCustomID[1];
  159. pKey[11]= (pCustomID[11] ^ (pCustomID[0] & pUID[1])) ^ pCustomID[2];
  160. }
  161. }
  162. /* UID�����㷨4 */
  163. static void Algorithm_4(char *pCustomID, char *pUID, char KeyLength, char *pKey)
  164. {
  165. pKey[0] = (pUID[0] & pCustomID[1]) ^ (pUID[2] & pCustomID[3]);
  166. pKey[1] = (pCustomID[1] ^ (pUID[2] & pCustomID[3])) ^ pUID[4];
  167. pKey[2] = (pCustomID[2] | (pUID[3] ^ pUID[4])) | pCustomID[3];
  168. pKey[3] = (pUID[3] - pCustomID[0]) | (pCustomID[2] ^ pUID[3]);
  169. if(KeyLength == 8)
  170. {
  171. pKey[4] = (pUID[4] ^ (pCustomID[5] & pUID[6])) ^ pCustomID[7];
  172. pKey[5] = pCustomID[5] | (pUID[6] ^ (pCustomID[7] & pUID[8]));
  173. pKey[6] = ((pCustomID[6] & pUID[7]) ^ pCustomID[6]) | pUID[9];
  174. pKey[7] = (pUID[7] - pCustomID[3]) | (pUID[9] ^ pCustomID[5]);
  175. }
  176. if(KeyLength == 12)
  177. {
  178. pKey[0] = (pUID[0] & pCustomID[1]) ^ (pUID[2] & pCustomID[3]);
  179. pKey[1] = (pCustomID[1] ^ (pUID[2] & pCustomID[3])) ^ pUID[4];
  180. pKey[2] = (pCustomID[2] | (pUID[3] ^ pUID[4])) | pCustomID[5];
  181. pKey[3] = (pUID[3] - pCustomID[4]) | (pCustomID[5] ^ pUID[6]);
  182. pKey[4] = (pUID[4] ^ (pCustomID[5] & pUID[6])) ^ pCustomID[7];
  183. pKey[5] = pCustomID[5] | (pUID[6] ^ (pCustomID[7] & pUID[8]));
  184. pKey[6] = ((pCustomID[6] & pUID[7]) ^ pCustomID[6]) | pUID[9];
  185. pKey[7] = (pUID[7] - pCustomID[8]) | (pUID[9] ^ pCustomID[10]);
  186. pKey[8] = (pCustomID[8] ^ (pUID[9] & pCustomID[10])) ^ pUID[11];
  187. pKey[9] = (pUID[9] ^ pCustomID[10]) | (pUID[11] & pCustomID[0]);
  188. pKey[10]= ((pUID[10] & pCustomID[11]) ^ pUID[0]) ^ pCustomID[1];
  189. pKey[11]= ((pCustomID[11] - pUID[0]) & pCustomID[1]) ^ pUID[2];
  190. }
  191. }
  192. /* ����UID�����㷨 ����ָ������ */
  193. typedef void (*Algorithm_Fun_Typedef)(char *pCustomID, char *pUID, char KeyLength, char *pKey);
  194. /* ����UID�����㷨 ����ָ������ */
  195. static const Algorithm_Fun_Typedef Algorithm_Fun_Array[5] =
  196. {
  197. Algorithm_0,
  198. Algorithm_1,
  199. Algorithm_2,
  200. Algorithm_3,
  201. Algorithm_4,
  202. };
  203. /****************************************** UID�����㷨 end ******************************************/
  204. /* ��С�����л� */
  205. #define BigLittleSwap32(A) ((((unsigned int)(A) & 0xFF000000) >> 24) | \
  206. (((unsigned int)(A) & 0x00FF0000) >> 8) | \
  207. (((unsigned int)(A) & 0x0000FF00) << 8) | \
  208. (((unsigned int)(A) & 0x000000FF) << 24))
  209. void LittleEndia_BigEndia_Interconvert_32(unsigned int* pBuffer, unsigned int WordLen)
  210. {
  211. unsigned int i;
  212. for(i = 0; i < WordLen; i ++)
  213. {
  214. pBuffer[i] = BigLittleSwap32(pBuffer[i]);
  215. }
  216. return;
  217. }
  218. static Algorithm_Fun_Typedef pAlgorithm_Fun;
  219. /****************** UID �㷨������Կ��֤ ******************/
  220. char UID_Encryption_Key_Check(void *pKey,
  221. void *pUID,
  222. void *pCustomID,
  223. eKeyLengthType keyLength,
  224. eEndiaType endiaType,
  225. eAlgorithmType AlgorithmNum)
  226. {
  227. char KeyBuf[12] = {0};//��ʱ�洢�����õ���Key
  228. /* ѡ���㷨��ʽ */
  229. pAlgorithm_Fun = Algorithm_Fun_Array[AlgorithmNum];
  230. /* ����KEY */
  231. (*pAlgorithm_Fun)(pCustomID, pUID, keyLength, KeyBuf);
  232. if(endiaType == BIG_ENDIA)
  233. {
  234. LittleEndia_BigEndia_Interconvert_32((unsigned int*)KeyBuf, keyLength/sizeof(unsigned int));
  235. }
  236. /* �Ƚ��ѻ���������¼��Key��ʹ����ͬ�㷨�����õ���key�Ƿ���ͬ */
  237. if(memcmp(pKey, KeyBuf, keyLength))
  238. {
  239. return 1;
  240. }
  241. return 0;
  242. }
  243. /****************** UID �㷨������Կ���� ******************/
  244. void UID_Encryption_Key_Calculate(void *pKey,
  245. void *pUID,
  246. void *pCustomID,
  247. eKeyLengthType keyLength,
  248. eEndiaType endiaType,
  249. eAlgorithmType AlgorithmNum)
  250. {
  251. /* ѡ���㷨��ʽ */
  252. pAlgorithm_Fun = Algorithm_Fun_Array[AlgorithmNum];
  253. /* ����KEY */
  254. (*pAlgorithm_Fun)(pCustomID, pUID, keyLength, pKey);
  255. if(endiaType == BIG_ENDIA)
  256. {
  257. LittleEndia_BigEndia_Interconvert_32((unsigned int*)pKey, keyLength/sizeof(unsigned int));
  258. }
  259. return;
  260. }