复件 SNRegister.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #include "StdAfx.h"
  2. #include "yDES.h"
  3. #include ".\snregister.h"
  4. char KeyCode[7][8] =
  5. {
  6. // 密钥1;
  7. 'A','T','O','M','8','2','8','K',
  8. // 密钥2;
  9. 'A','K','C','L','8','9','8','T',
  10. // 密钥3;
  11. 'A','B','J','I','8','7','8','P',
  12. // 密钥4;
  13. 'K','U','C','G','8','6','8','E',
  14. // 密钥5;
  15. 'A','A','S','D','7','0','8','S',
  16. // 密钥6;
  17. 'W','B','V','B','9','0','8','X',
  18. // 密钥7;
  19. 'E','B','T','N','1','0','7','Z',
  20. };
  21. CSNRegister::CSNRegister()
  22. {
  23. m_strStart.Format("%d",127);
  24. m_strCode = "";
  25. m_strSn = "";
  26. m_strUseTime = "";
  27. m_strPName = "";
  28. m_strStartTime = "";
  29. m_strEndTime = "";
  30. m_strLeftTime = "";
  31. m_strCheck = "";
  32. m_strEndof.Format("%d",13);
  33. }
  34. CSNRegister::~CSNRegister()
  35. {
  36. }
  37. BOOL CSNRegister::Load(const char *&pStrDirectroy)
  38. {
  39. CFile file;
  40. if (file.Open(pStrDirectroy, CFile::modeRead))
  41. {
  42. CArchive ar(&file,CArchive::load);
  43. Serialize(ar);
  44. ar.Close();
  45. file.Close();
  46. }
  47. if ( m_strStart != "127" || m_strEndof != "13")
  48. {
  49. return FALSE;
  50. }
  51. return TRUE;
  52. }
  53. void CSNRegister::Store(const char *&pStrDirectroy)
  54. {
  55. CFile file;
  56. CFileException e;
  57. if(file.Open(pStrDirectroy, CFile::modeWrite|CFile::modeCreate, &e))
  58. {
  59. CArchive ar(&file,CArchive::store);
  60. Serialize(ar);
  61. ar.Close();
  62. file.Close();
  63. }
  64. else
  65. {
  66. #ifdef _DEBUG
  67. afxDump << "File could not be opened " << e.m_cause << "\n";
  68. #endif
  69. }
  70. }
  71. void CSNRegister::Serialize(CArchive& ar)
  72. {
  73. CObject::Serialize(ar);
  74. if(ar.IsStoring())
  75. {
  76. ar << m_strStart;
  77. ar << m_strCode;
  78. ar << m_strSn;
  79. ar << m_strUseTime;
  80. ar << m_strPName;
  81. ar << m_strStartTime;
  82. ar << m_strEndTime;
  83. ar << m_strLeftTime;
  84. ar << m_strCheck;
  85. ar << m_strEndof;
  86. }
  87. else
  88. {
  89. ar >> m_strStart;
  90. ar >> m_strCode;
  91. ar >> m_strSn;
  92. ar >> m_strUseTime;
  93. ar >> m_strPName;
  94. ar >> m_strStartTime;
  95. ar >> m_strEndTime;
  96. ar >> m_strLeftTime;
  97. ar >> m_strCheck;
  98. ar >> m_strEndof;
  99. }
  100. }
  101. void CSNRegister::ShowCihper(char *rtext,long len)
  102. {
  103. len=(len+7)&0xfffffff8 ;
  104. int i;
  105. int p;
  106. char rtext2[1024] = {0};
  107. unsigned char c1,c2,c3;
  108. //处理
  109. p = 0;
  110. for (i = 0; i < len; i++)
  111. {
  112. c3 = rtext[i];
  113. c1 = c3 >> 4;
  114. c2 = c3 & 15;
  115. if (c1 <=9 && c1 >= 0) c1=c1+'0';
  116. if (c1 <=15 && c1 >= 10) c1=c1-10+'A';
  117. if (c2 <=9 && c2 >= 0) c2=c2+'0';
  118. if (c2 <=15 && c2 >= 10) c2=c2-10+'A';
  119. rtext2[p]=c1;
  120. rtext2[p+1]=c2;
  121. p+=2;
  122. }
  123. rtext2[p] = 0;
  124. memcpy(rtext,rtext2,p+1);
  125. }
  126. void CSNRegister::HalfByteToByte(char *rin,CString &strout, long len)
  127. {
  128. int i =0;
  129. char rout[1024] = {0};
  130. for (i=0; i<len; i++)
  131. {
  132. if (rin[i]>='0' && rin[i] <= '9') rin[i] = rin[i]-'0';
  133. if (rin[i]>='A' && rin[i] <= 'F') rin[i] = rin[i]-'A'+10;
  134. }
  135. for (i=0;i<len;i+=2)
  136. {
  137. rout[i/2] = rin[i]*16 + rin[i+1];
  138. }
  139. rout[i] = 0;
  140. strout = rout;
  141. }
  142. void CSNRegister::encrypt(char *byCode, char *bySn, char *byUseTime, char *byPName, char *byStartTime, char *byEndTime, char *byLeftTime)
  143. {
  144. yDES ydes;
  145. BYTE sztmp[1024] = {0};
  146. //int nlen = 0;
  147. // 特征码 1;
  148. //nlen = strlen(byCode);
  149. ydes.DES_Act(sztmp, byCode, strlen(byCode)+1, KeyCode[0], 8);
  150. ShowCihper(sztmp,strlen(byCode)+1);
  151. m_strCode = sztmp;
  152. // SN码 2;
  153. //nlen = strlen(bySn);
  154. memset(sztmp,0,1024);
  155. ydes.DES_Act(sztmp, bySn, strlen(bySn)+1, KeyCode[1], 8);
  156. ShowCihper(sztmp,strlen(bySn)+1);
  157. m_strSn = sztmp;
  158. // 试用时间 3;
  159. //nlen = strlen(byUseTime);
  160. memset(sztmp,0,1024);
  161. ydes.DES_Act(sztmp, byUseTime, strlen(byUseTime)+1, KeyCode[2], 8);
  162. ShowCihper(sztmp,strlen(byUseTime)+1);
  163. m_strUseTime = sztmp;
  164. // 项目名称 4;
  165. //nlen = strlen(byPName);
  166. memset(sztmp,0,1024);
  167. ydes.DES_Act(sztmp, byPName, strlen(byPName)+1, KeyCode[3], 8);
  168. ShowCihper(sztmp,strlen(byPName)+1);
  169. m_strPName = sztmp;
  170. // 建成时间 5;
  171. //nlen = strlen(byStartTime);
  172. memset(sztmp,0,1024);
  173. ydes.DES_Act(sztmp, byStartTime, strlen(byStartTime)+1, KeyCode[4], 8);
  174. ShowCihper(sztmp,strlen(byStartTime)+1);
  175. m_strStartTime = sztmp;
  176. // 完成时间 6;
  177. //nlen = strlen(byEndTime);
  178. memset(sztmp,0,1024);
  179. ydes.DES_Act(sztmp, byEndTime, strlen(byEndTime)+1, KeyCode[5], 8);
  180. ShowCihper(sztmp,strlen(byEndTime)+1);
  181. m_strEndTime = sztmp;
  182. // 剩余时间 7;
  183. //nlen = strlen(byLeftTime);
  184. memset(sztmp,0,1024);
  185. ydes.DES_Act(sztmp, byLeftTime, strlen(byLeftTime)+1, KeyCode[6], 8);
  186. ShowCihper(sztmp,strlen(byLeftTime)+1);
  187. m_strLeftTime = sztmp;
  188. }
  189. void CSNRegister::decrypt(char *byCode, char *bySn, char *byUseTime, char *byPName, char *byStartTime, char *byEndTime, char *byLeftTime)
  190. {
  191. }
  192. BOOL CSNRegister::open_snfile(const char *szfile)
  193. {
  194. Load(szfile);
  195. if ( m_strStart != "127" || m_strEndof != "13")
  196. return FALSE;
  197. yDES ydes;
  198. char sztmp[1024] = {0};
  199. // 1.特征码;
  200. memcpy(sztmp,m_strCode.GetBuffer(),m_strCode.GetLength());
  201. HalfByteToByte(sztmp,m_strCode,m_strCode.GetLength());
  202. memset(sztmp,0,1024);
  203. ydes.DES_Act(sztmp,m_strCode.GetBuffer(),m_strCode.GetLength(),KeyCode[0],8,DECRYPT);m_strCode.ReleaseBuffer();
  204. m_strCode = "";
  205. m_strCode = sztmp;
  206. // 2.SN码;
  207. //nlen = m_strSn.GetLength();
  208. memset(sztmp,0,1024);
  209. memcpy(sztmp,m_strSn.GetBuffer(),m_strSn.GetLength());
  210. HalfByteToByte(sztmp,m_strSn,m_strSn.GetLength());
  211. memset(sztmp,0,1024);
  212. ydes.DES_Act(sztmp,m_strSn.GetBuffer(),m_strSn.GetLength(),KeyCode[1],8,DECRYPT);m_strSn.ReleaseBuffer();
  213. m_strSn = "";
  214. m_strSn = sztmp;
  215. // 3.试用时间;
  216. memset(sztmp,0,1024);
  217. memcpy(sztmp,m_strUseTime.GetBuffer(),m_strUseTime.GetLength());
  218. HalfByteToByte(sztmp,m_strUseTime,m_strUseTime.GetLength());
  219. memset(sztmp,0,1024);
  220. ydes.DES_Act(sztmp,m_strUseTime.GetBuffer(),m_strUseTime.GetLength(),KeyCode[2],8,DECRYPT);m_strUseTime.ReleaseBuffer();
  221. m_strUseTime = "";
  222. m_strUseTime = sztmp;
  223. // 4.项目名称;
  224. memset(sztmp,0,1024);
  225. memcpy(sztmp,m_strPName.GetBuffer(),m_strPName.GetLength());
  226. HalfByteToByte(sztmp,m_strPName,m_strPName.GetLength());
  227. memset(sztmp,0,1024);
  228. ydes.DES_Act(sztmp,m_strPName.GetBuffer(),m_strPName.GetLength(),KeyCode[3],8,DECRYPT);m_strPName.ReleaseBuffer();
  229. m_strPName = "";
  230. m_strPName = sztmp;
  231. // 5.建成时间;
  232. memset(sztmp,0,1024);
  233. memcpy(sztmp,m_strStartTime.GetBuffer(),m_strStartTime.GetLength());
  234. HalfByteToByte(sztmp,m_strStartTime,m_strStartTime.GetLength());
  235. memset(sztmp,0,1024);
  236. ydes.DES_Act(sztmp,m_strStartTime.GetBuffer(),m_strStartTime.GetLength(),KeyCode[4],8,DECRYPT);m_strStartTime.ReleaseBuffer();
  237. m_strStartTime = "";
  238. m_strStartTime = sztmp;
  239. // 6.完成时间;
  240. memset(sztmp,0,1024);
  241. memcpy(sztmp,m_strEndTime.GetBuffer(),m_strEndTime.GetLength());
  242. HalfByteToByte(sztmp,m_strEndTime,m_strEndTime.GetLength());
  243. memset(sztmp,0,1024);
  244. ydes.DES_Act(sztmp,m_strEndTime.GetBuffer(),m_strEndTime.GetLength(),KeyCode[5],8,DECRYPT);m_strEndTime.ReleaseBuffer();
  245. m_strEndTime = "";
  246. m_strEndTime = sztmp;
  247. // 7.剩余时间;
  248. memset(sztmp,0,1024);
  249. memcpy(sztmp,m_strLeftTime.GetBuffer(),m_strLeftTime.GetLength());
  250. HalfByteToByte(sztmp,m_strLeftTime,m_strLeftTime.GetLength());
  251. memset(sztmp,0,1024);
  252. ydes.DES_Act(sztmp,m_strLeftTime.GetBuffer(),m_strLeftTime.GetLength(),KeyCode[6],8,DECRYPT);m_strLeftTime.ReleaseBuffer();
  253. m_strLeftTime = "";
  254. m_strLeftTime = sztmp;
  255. return TRUE;
  256. }
  257. int CSNRegister::GetCheck(BOOL btype)
  258. {
  259. char szCheck[1024] = {0};
  260. DWORD dwSum = 0;
  261. GetByteSum(dwSum ,m_strCode);
  262. GetByteSum(dwSum ,m_strSn);
  263. GetByteSum(dwSum ,m_strUseTime);
  264. GetByteSum(dwSum ,m_strPName);
  265. GetByteSum(dwSum ,m_strStartTime);
  266. GetByteSum(dwSum ,m_strEndTime);
  267. GetByteSum(dwSum ,m_strLeftTime);
  268. dwSum = ~dwSum;
  269. dwSum++;
  270. itoa(dwSum, szCheck, 16);
  271. for (int i(0); i < 5 ; i++)
  272. {
  273. if( szCheck[i] >= 'a' && szCheck[i] <= 'z' )
  274. {
  275. szCheck[i] = szCheck[i] - 'a' + 'A';
  276. }
  277. }
  278. if (btype == CREATE)
  279. {
  280. m_strCheck = szCheck;
  281. }
  282. else
  283. {
  284. if (m_strCheck.Compare(szCheck) == -1)
  285. return -1;
  286. }
  287. return 0;
  288. }
  289. void CSNRegister::GetByteSum(DWORD &dwSum, CString &strSrc)
  290. {
  291. //int len = strSrc.GetLength();
  292. for (int i = 0; i < strSrc.GetLength(); i++)
  293. {
  294. dwSum += strSrc.GetAt(i);
  295. }
  296. }
  297. BOOL CSNRegister::create_snfile(const char *szfile, char *byCode, char *bySn, char *byUseTime, char *byPName, char *byStartTime, char *byEndTime, char *byLeftTime)
  298. {
  299. encrypt(byCode,bySn,byUseTime,byPName,byStartTime,byEndTime,byLeftTime);
  300. GetCheck(CREATE);
  301. Store(szfile);
  302. return 0;
  303. }
  304. BOOL CSNRegister::modify_snfile(const char *szfile, char *byCode, char *bySn, char *byUseTime, char *byPName, char *byStartTime, char *byEndTime, char *byLeftTime)
  305. {
  306. return 0;
  307. }