hytos / DTI_PID / SPPIDConverter / License.cs @ c0a42e90
이력 | 보기 | 이력해설 | 다운로드 (13.9 KB)
1 | 91c7a82a | gaqhf | using System; |
---|---|---|---|
2 | using System.Collections.Generic; |
||
3 | using System.Linq; |
||
4 | using System.Text; |
||
5 | using System.Threading.Tasks; |
||
6 | using System.Security.Cryptography; |
||
7 | using System.IO; |
||
8 | using Microsoft.Win32; |
||
9 | using System.Net.NetworkInformation; |
||
10 | 7b476006 | esham21 | using Converter.SPPID.Form; |
11 | using System.Windows.Forms; |
||
12 | using Converter.SPPID.Properties; |
||
13 | using System.Net; |
||
14 | using JWT; |
||
15 | using JWT.Algorithms; |
||
16 | using JWT.Serializers; |
||
17 | using JWT.Exceptions; |
||
18 | using Newtonsoft.Json; |
||
19 | 91c7a82a | gaqhf | |
20 | namespace DOFTECH.License |
||
21 | { |
||
22 | 7b476006 | esham21 | public class LicenseDTO |
23 | { |
||
24 | /// <summary> |
||
25 | /// 라이센스 고유 값 |
||
26 | /// </summary> |
||
27 | public int uid { get; set; } |
||
28 | |||
29 | /// <summary> |
||
30 | /// MAC 주소 |
||
31 | /// </summary> |
||
32 | public string mac { get; set; } |
||
33 | |||
34 | /// <summary> |
||
35 | /// 메일 주소 |
||
36 | /// </summary> |
||
37 | public string email { get; set; } |
||
38 | |||
39 | /// <summary> |
||
40 | /// 어플리케이션 |
||
41 | /// </summary> |
||
42 | public string app { get; set; } |
||
43 | |||
44 | /// <summary> |
||
45 | /// 라이센스 코드 |
||
46 | /// </summary> |
||
47 | public string code { get; set; } |
||
48 | |||
49 | /// <summary> |
||
50 | /// api name. |
||
51 | /// </summary> |
||
52 | public string api { get; set; } |
||
53 | |||
54 | /// <summary> |
||
55 | /// 만료 시간. |
||
56 | /// </summary> |
||
57 | public string expiration_date { get; set; } |
||
58 | |||
59 | /// <summary> |
||
60 | /// 만료 시간. |
||
61 | /// </summary> |
||
62 | public string exp { get; set; } |
||
63 | |||
64 | /// <summary> |
||
65 | /// License 개수 |
||
66 | /// </summary> |
||
67 | public int count { get; set; } |
||
68 | } |
||
69 | |||
70 | public class LicenseReturn |
||
71 | { |
||
72 | /// <summary> |
||
73 | /// STATUS |
||
74 | /// </summary> |
||
75 | public bool success { get; set; } |
||
76 | |||
77 | /// <summary> |
||
78 | /// CODE |
||
79 | /// </summary> |
||
80 | public int code { get; set; } |
||
81 | |||
82 | /// <summary> |
||
83 | /// MSG |
||
84 | /// </summary> |
||
85 | public string msg { get; set; } |
||
86 | |||
87 | /// <summary> |
||
88 | /// DATA |
||
89 | /// </summary> |
||
90 | public string data { get; set; } |
||
91 | } |
||
92 | |||
93 | 91c7a82a | gaqhf | public static class License |
94 | { |
||
95 | 7b476006 | esham21 | //public static bool IsEnabled() |
96 | //{ |
||
97 | // bool result = false; |
||
98 | // string path = string.Empty; |
||
99 | |||
100 | // try |
||
101 | // { |
||
102 | // RegistryKey key = Registry.LocalMachine; |
||
103 | // RegistryKey software = key.OpenSubKey("SOFTWARE"); |
||
104 | // RegistryKey DOFTECH = software.OpenSubKey("DOFTECH"); |
||
105 | // RegistryKey SPPIDConverter = DOFTECH.OpenSubKey("SPPIDConverter", true); |
||
106 | // path = SPPIDConverter.GetValue("path") + "licenses.licx"; |
||
107 | // if (File.Exists(path)) |
||
108 | // { |
||
109 | // string data = File.ReadAllText(path); |
||
110 | // data = Crypt.decrypt(data, "dof1073#"); |
||
111 | // if (data.StartsWith("Date:")) |
||
112 | // { |
||
113 | // data = data.Remove(0, "Date:".Length); |
||
114 | |||
115 | // if (string.IsNullOrEmpty(data)) |
||
116 | // { |
||
117 | // DateTime dataTime = new DateTime(2000, 1, 1); |
||
118 | // DateTime currentTime = DateTime.Now; |
||
119 | // if (DateTime.TryParse(Converter.SPPID.Properties.Resources.lic, out dataTime) && DateTime.Compare(dataTime.AddDays(150), currentTime) >= 0) |
||
120 | // result = true; |
||
121 | // } |
||
122 | // } |
||
123 | // else if (data.StartsWith("Absolute:")) |
||
124 | // { |
||
125 | // data = data.Remove(0, "Absolute:".Length); |
||
126 | // string macAddress = NetworkInterface.GetAllNetworkInterfaces()[0].GetPhysicalAddress().ToString(); |
||
127 | // if (string.IsNullOrEmpty(data)) |
||
128 | // { |
||
129 | // data = "Absolute:" + macAddress; |
||
130 | // data = Crypt.encrypt(data, "dof1073#"); |
||
131 | // File.WriteAllText(path, data); |
||
132 | // result = true; |
||
133 | // } |
||
134 | // else if (macAddress == data) |
||
135 | // result = true; |
||
136 | // } |
||
137 | // } |
||
138 | // } |
||
139 | // catch (Exception ex) |
||
140 | // { |
||
141 | |||
142 | // } |
||
143 | |||
144 | // return result; |
||
145 | //} |
||
146 | |||
147 | 91c7a82a | gaqhf | public static bool IsEnabled() |
148 | { |
||
149 | bool result = false; |
||
150 | |||
151 | 561be905 | esham21 | return true; // skip checking |
152 | 7e8eccb1 | esham21 | |
153 | 91c7a82a | gaqhf | try |
154 | { |
||
155 | 7b476006 | esham21 | string key = Settings.Default.LicenseKey; |
156 | if (!string.IsNullOrEmpty(key)) |
||
157 | { |
||
158 | key = Crypt.decrypt(key, "dof1073#"); |
||
159 | 4b97b147 | esham21 | |
160 | if (CheckLocalKey(key)) |
||
161 | { |
||
162 | Settings.Default.LicenseKey = Crypt.encrypt(key, "dof1073#"); |
||
163 | Settings.Default.Save(); |
||
164 | |||
165 | return true; |
||
166 | } |
||
167 | 7b476006 | esham21 | } |
168 | else |
||
169 | 91c7a82a | gaqhf | { |
170 | 7b476006 | esham21 | key = "dummy"; // must fail |
171 | } |
||
172 | |||
173 | if (!CheckLicense(key)) |
||
174 | { |
||
175 | var dlg = new LicenseForm(); |
||
176 | if (dlg.ShowDialog() == DialogResult.OK) |
||
177 | 91c7a82a | gaqhf | { |
178 | 7b476006 | esham21 | key = dlg.key; |
179 | 4b97b147 | esham21 | |
180 | if (CheckLocalKey(key)) |
||
181 | { |
||
182 | Settings.Default.LicenseKey = Crypt.encrypt(key, "dof1073#"); |
||
183 | Settings.Default.Save(); |
||
184 | |||
185 | return true; |
||
186 | } |
||
187 | 7b476006 | esham21 | } |
188 | 91c7a82a | gaqhf | |
189 | 7b476006 | esham21 | if (CheckLicense(key)) |
190 | { |
||
191 | Settings.Default.LicenseKey = Crypt.encrypt(key, "dof1073#"); |
||
192 | Settings.Default.Save(); |
||
193 | |||
194 | result = true; |
||
195 | 91c7a82a | gaqhf | } |
196 | 8579be27 | esham21 | else |
197 | { |
||
198 | Settings.Default.LicenseKey = Crypt.encrypt("dummy", "dof1073#"); |
||
199 | Settings.Default.Save(); |
||
200 | } |
||
201 | 7b476006 | esham21 | } |
202 | else |
||
203 | { |
||
204 | result = true; |
||
205 | } |
||
206 | } |
||
207 | catch (Exception ex) |
||
208 | { |
||
209 | 4d4dce52 | esham21 | MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); |
210 | 7b476006 | esham21 | } |
211 | |||
212 | return result; |
||
213 | } |
||
214 | |||
215 | 4b97b147 | esham21 | public static bool CheckLocalKey(string key) |
216 | { |
||
217 | //return false; // for erase key |
||
218 | try |
||
219 | { |
||
220 | string _key = "Image Drawing to Intelligent Drawing"; |
||
221 | |||
222 | string incoming = key.Replace('_', '/').Replace('-', '+'); |
||
223 | switch (key.Length % 4) |
||
224 | { |
||
225 | case 2: incoming += "=="; break; |
||
226 | case 3: incoming += "="; break; |
||
227 | } |
||
228 | byte[] bytes = Convert.FromBase64String(incoming); |
||
229 | string originalText = Encoding.ASCII.GetString(bytes); |
||
230 | |||
231 | string decodeText = ""; |
||
232 | //for (int i = 0; i < originalText.Length; i++) |
||
233 | //{ |
||
234 | // var key_c = _key[i % _key.Length]; |
||
235 | // var dec_c = (char)((256 + originalText[i] - (key_c)) % 256); |
||
236 | // decodeText += dec_c; |
||
237 | //} |
||
238 | for (int i = 0; i < bytes.Length; i++) |
||
239 | { |
||
240 | var key_c = _key[i % _key.Length]; |
||
241 | var dec_c = (char)((256 + bytes[i] - (key_c)) % 256); |
||
242 | decodeText += dec_c; |
||
243 | } |
||
244 | |||
245 | if (SystemInformation.ComputerName == decodeText) |
||
246 | { |
||
247 | return true; |
||
248 | } |
||
249 | } |
||
250 | catch (Exception ex) |
||
251 | { |
||
252 | // local key가 아님 |
||
253 | } |
||
254 | |||
255 | return false; |
||
256 | } |
||
257 | |||
258 | 7b476006 | esham21 | public static bool CheckLicense(string key) |
259 | { |
||
260 | 4b97b147 | esham21 | //return false; // for erase key |
261 | 7b476006 | esham21 | try |
262 | { |
||
263 | const string secret = "795hi#(7qq5&p#f3ysa#n-449h8g_n95olca)b%t23s7!w%v0m"; |
||
264 | |||
265 | if (key != "dummy") |
||
266 | { |
||
267 | IJsonSerializer serializer = new JsonNetSerializer(); |
||
268 | var provider = new UtcDateTimeProvider(); |
||
269 | IJwtValidator validator = new JwtValidator(serializer, provider); |
||
270 | IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); |
||
271 | IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); // symmetric |
||
272 | IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm); |
||
273 | var json = decoder.Decode(key, secret, verify: true); |
||
274 | var licenseDto = JsonConvert.DeserializeObject<LicenseDTO>(json); |
||
275 | |||
276 | if (NetworkInterface.GetAllNetworkInterfaces()[0].GetPhysicalAddress().ToString() != licenseDto.mac) |
||
277 | 0ee10e77 | esham21 | //if ("00155D0B4A1A" != licenseDto.mac) |
278 | 7b476006 | esham21 | { |
279 | return false; |
||
280 | } |
||
281 | |||
282 | string url = licenseDto.api; |
||
283 | string responseText = string.Empty; |
||
284 | |||
285 | HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); |
||
286 | request.Method = "GET"; |
||
287 | request.Timeout = 5 * 1000; |
||
288 | request.ContentType = "application/json"; |
||
289 | request.Headers.Add("x-auth-token:" + key); |
||
290 | |||
291 | bool validKey = true; |
||
292 | |||
293 | using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) |
||
294 | 91c7a82a | gaqhf | { |
295 | 7b476006 | esham21 | HttpStatusCode status = resp.StatusCode; |
296 | Console.WriteLine(status); |
||
297 | |||
298 | Stream respStream = resp.GetResponseStream(); |
||
299 | using (StreamReader sr = new StreamReader(respStream)) |
||
300 | 91c7a82a | gaqhf | { |
301 | 7b476006 | esham21 | responseText = sr.ReadToEnd(); |
302 | var licenseReturn = JsonConvert.DeserializeObject<LicenseReturn>(responseText); |
||
303 | |||
304 | if (!licenseReturn.success) |
||
305 | { |
||
306 | MessageBox.Show(licenseReturn.msg, "SPPID Converter", MessageBoxButtons.OK, MessageBoxIcon.Warning); |
||
307 | validKey = false; |
||
308 | } |
||
309 | 91c7a82a | gaqhf | } |
310 | } |
||
311 | 7b476006 | esham21 | |
312 | return validKey; |
||
313 | 91c7a82a | gaqhf | } |
314 | } |
||
315 | catch (Exception ex) |
||
316 | { |
||
317 | 4d4dce52 | esham21 | MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); |
318 | 91c7a82a | gaqhf | } |
319 | |||
320 | 7b476006 | esham21 | return false; |
321 | 91c7a82a | gaqhf | } |
322 | |||
323 | public static string SHA256Hash(string data) |
||
324 | { |
||
325 | |||
326 | SHA256 sha = new SHA256Managed(); |
||
327 | byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(data)); |
||
328 | StringBuilder stringBuilder = new StringBuilder(); |
||
329 | foreach (byte b in hash) |
||
330 | { |
||
331 | stringBuilder.AppendFormat("{0:x2}", b); |
||
332 | } |
||
333 | return stringBuilder.ToString(); |
||
334 | } |
||
335 | |||
336 | private static void CreateDateLicenseFile() |
||
337 | { |
||
338 | string path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\[Date]licenses.licx"; |
||
339 | string data = "Date:"; |
||
340 | using (StreamWriter sw = File.CreateText(path)) |
||
341 | { |
||
342 | data = Crypt.encrypt(data, "dof1073#"); |
||
343 | sw.Write(data); |
||
344 | sw.Close(); |
||
345 | sw.Dispose(); |
||
346 | } |
||
347 | } |
||
348 | |||
349 | private static void CreateAbsoluteLicenseFile() |
||
350 | { |
||
351 | string path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\[Absolute]licenses.licx"; |
||
352 | string data = "Absolute:"; |
||
353 | using (StreamWriter sw = File.CreateText(path)) |
||
354 | { |
||
355 | data = Crypt.encrypt(data, "dof1073#"); |
||
356 | sw.Write(data); |
||
357 | sw.Close(); |
||
358 | sw.Dispose(); |
||
359 | } |
||
360 | } |
||
361 | } |
||
362 | |||
363 | class Crypt |
||
364 | { |
||
365 | public static String encrypt(String text, String password) |
||
366 | { |
||
367 | RijndaelManaged RijndaelCipher = new RijndaelManaged(); |
||
368 | byte[] plainText = Encoding.UTF8.GetBytes(text); |
||
369 | byte[] salt = Encoding.UTF8.GetBytes(password); |
||
370 | PasswordDeriveBytes secretKey = new PasswordDeriveBytes(password, salt); |
||
371 | ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)); |
||
372 | MemoryStream memoryStream = new MemoryStream(); |
||
373 | CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write); |
||
374 | cryptoStream.Write(plainText, 0, plainText.Length); // 암호화 시작 |
||
375 | cryptoStream.FlushFinalBlock(); |
||
376 | byte[] cryptBytes = memoryStream.ToArray(); |
||
377 | // 스트림을 닫습니다. |
||
378 | memoryStream.Close(); |
||
379 | cryptoStream.Close(); |
||
380 | String cryptResult = Convert.ToBase64String(cryptBytes); |
||
381 | return cryptResult; // 암호화 문자열 리턴. |
||
382 | } |
||
383 | public static String decrypt(String text, String password) |
||
384 | { |
||
385 | RijndaelManaged RijndaelCipher = new RijndaelManaged(); |
||
386 | byte[] encryptData = Convert.FromBase64String(text); |
||
387 | byte[] salt = Encoding.UTF8.GetBytes(password); |
||
388 | PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(password, salt); |
||
389 | ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16)); |
||
390 | MemoryStream memoryStream = new MemoryStream(encryptData); |
||
391 | CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read); |
||
392 | byte[] PlainText = new byte[encryptData.Length]; |
||
393 | // 복호화 시작 |
||
394 | int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length); |
||
395 | memoryStream.Close(); |
||
396 | cryptoStream.Close(); |
||
397 | // 복호화된 데이터를 문자열로 바꾼다. |
||
398 | string DecryptedData = Encoding.UTF8.GetString(PlainText, 0, DecryptedCount); |
||
399 | // 최종 결과 리턴 |
||
400 | return DecryptedData; |
||
401 | } |
||
402 | } |
||
403 | } |