# 【易语言】对接卡密验证V2实例源码下载 (opens new window)
- AEC加解密 含MD5
.版本 2
.支持库 iext
.支持库 dp1
.支持库 eAPI
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 长度, 整数型
.局部变量 土豆, 对象
卡密.内容 = 读配置项 (“C:\记忆.ini”, “卡密”, “卡密”, )
密匙 = “mxwlgzs0”
长度 = 取文本长度 (密匙)
.判断循环首 (长度 < 32)
密匙 = 密匙 + “0”
长度 = 长度 + 1
.判断循环尾 ()
土豆 = 土豆 ()
标签_设备ID.标题 = “设备ID:” + 设备ID ()
.子程序 _按钮_登录_被单击
.局部变量 URL, 文本型
.局部变量 请求头部_对象, 类_POST数据类
.局部变量 请求头部, 文本型
.局部变量 请求内容_对象, 类_POST数据类
.局部变量 请求内容, 文本型
.局部变量 返回内容, 文本型
.局部变量 body, 文本型
.局部变量 JSON, 类_json
.局部变量 code, 整数型
.局部变量 exTime, 文本型
.局部变量 土豆, 对象
土豆 = 土豆 ()
URL = “https://api.potatocloud.cn/api/verifyCardV2”
请求头部_对象.添加 (“Content-Type”, “application/json”)
请求头部_对象.添加 (“askKey”, #askKey)
请求头部_对象.添加 (“sign”, 土豆.sign)
请求头部_对象.添加 (“time”, 土豆.time)
请求头部 = 请求头部_对象.获取协议头数据 ()
请求内容_对象.添加 (“cardStr”, 编码_BASE64编码 (对称加密 (到字节集 (卡密.内容), 到字节集 (密匙), #对称算法_AES_256_ECB, , )))
请求内容_对象.添加 (“mac”, 编码_BASE64编码 (对称加密 (到字节集 (设备ID ()), 到字节集 (密匙), #对称算法_AES_256_ECB, , )))
请求内容 = 请求内容_对象.获取JSON文本 ()
返回内容 = 到文本 (对称解密 (编码_BASE64解码 (到文本 (网页_访问S (URL, 1, 请求内容, , , 请求头部, , , , , , , , , , , , ))), 到字节集 (密匙), #对称算法_AES_256_ECB, , ))
body = 到文本 (返回内容)
JSON.解析 (编码_utf8到gb2312 (body))
code = 到数值 (JSON.取通用属性 (“code”))
.如果 (code ≠ 200)
信息框 (到文本 (JSON.取通用属性 (“message”)), #错误图标, “code:” + 到文本 (code), )
返回 ()
.否则
.如果结束
exTime = 到文本 (JSON.取通用属性 (“data.exTime”))
信息框 (“到期时间:” + exTime, 0, “卡密验证成功”, )
.子程序 _卡密_内容被改变
写配置项 (“C:\记忆.ini”, “卡密”, “卡密”, 卡密.内容)
.子程序 土豆, 对象
.局部变量 土豆, 对象
.局部变量 验签加密字符串, 文本型
验签加密字符串 = “tudouapi”
土豆.sign = 取数据摘要 (到字节集 (验签加密字符串 + 时间_取现行时间戳 ()))
土豆.time = 时间_取现行时间戳 ()
返回 (土豆)
.子程序 设备ID, 文本型, , 获取设备ID
.参数 revCpu, 文本型, 可空
.参数 revDisk, 文本型, 可空
.参数 revNet, 文本型, 可空
.局部变量 Cpu, CPU信息
.局部变量 Disk, 硬盘信息
.局部变量 Net, 网卡信息, , "0"
.局部变量 s1, 整数型, , , -4
.局部变量 s2, 整数型, , , -8
.局部变量 s3, 整数型, , , -12
.局部变量 s4, 整数型, , , -16
.局部变量 X
.局部变量 Cpuinf, 文本型
.局部变量 Diskinf, 文本型
置入代码 ({ 184, 0, 0, 0, 0, 49, 210, 15, 162, 137, 85, 252, 137, 69, 248 })
置入代码 ({ 184, 1, 0, 0, 0, 49, 201, 49, 210, 15, 162, 137, 85, 244, 137, 69, 240 })
Cpuinf = 格式化文本 (“%X%X%X%X”, s1, s2, s3, s4)
取CPU信息 (Cpu)
取硬盘信息 (Disk, )
Net = 取网卡信息列表 ()
.计次循环首 (取数组成员数 (Net), X)
.如果真 (Net [X].物理地址 ≠ “00-00-00-00-00-00”)
revNet = revNet + Net [X].物理地址 + Net [X].网卡名称
.如果真结束
.计次循环尾 ()
revNet = 取数据摘要 (到字节集 (revNet))
revCpu = 取数据摘要 (到字节集 (Cpuinf + Cpu.名称 + Cpu.序列号))
revDisk = 取数据摘要 (到字节集 (Disk.型号 + Disk.版本号 + Disk.序列号 + Disk.版本号))
返回 (取文本左边 (取数据摘要 (到字节集 (revCpu + revDisk + revNet)), 32))
.子程序 _标签_设备ID2_鼠标左键被按下, 逻辑型
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型
打开指定网址 (“https://api.potatocloud.cn/”)
.子程序 _画板1_鼠标左键被按下, 逻辑型
.参数 横向位置, 整数型
.参数 纵向位置, 整数型
.参数 功能键状态, 整数型
打开指定网址 (“https://api.potatocloud.cn/”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
← Node.js