const (
SingleUserLicense
=
1
MultipleUserLicense
=
2
CorporateSiteLicense
=
3
CorporateWorldwideLicense
=
4
)
/
/
自定义生成
var (
UserName
=
"pediy"
/
/
用户名
LicenseCount
=
10
/
/
license组数
LicenseType
=
CorporateWorldwideLicense
/
/
license类型
)
func main() {
fmt.Println(UserName)
for
i :
=
0
; i < LicenseCount; {
code :
=
Keygen(UserName, LicenseType)
/
/
检查长度合法
if
len
(code)
=
=
23
{
fmt.Println(code)
i
+
+
}
}
}
func Keygen(user string, lictype
int
) string {
/
/
code1
=
随机
8
位大写字符
code1 :
=
GenerateCode1()
/
/
检查License(简单粗暴)
if
!VerifyLicense(lictype, code1) {
return
""
}
/
/
合并用户名和code1
merged :
=
MergeKeyCode(user, code1)
/
/
key
=
code1
+
code2
+
code3
v1 :
=
[]byte(code1)
v2 :
=
[]byte(merged)
key :
=
code1
+
GenerateCode2(v1, v2)
+
GenerateCode3(v1, v2)
/
/
分
4
段输出
for
i :
=
5
; i <
len
(key); i
+
=
6
{
key
=
key[:i]
+
"-"
+
key[i:]
}
return
key
}
/
/
互相交叉
func MergeKeyCode(user, code string) string {
user
=
strings.ToUpper(user)
var count
int
if
count
=
len
(user); count >
8
{
count
=
8
}
var merged string
var i
int
for
i
=
0
; i < count; i
+
+
{
merged
+
=
user[i:i
+
1
]
+
code[i:i
+
1
]
}
if
i
+
1
<
len
(user) {
merged
+
=
user[i:]
}
else
{
merged
+
=
code[i:]
}
return
merged
}
/
/
检查License格式
func VerifyLicense(lictype
int
, code1 string)
bool
{
temp :
=
[]rune(code1)
x1 :
=
int8(temp[
3
:
4
][
0
])
-
int8(
'M'
)
x2 :
=
int8(temp[
7
:
8
][
0
])
-
int8(
'D'
)
x3 :
=
int8(temp[
5
:
6
][
0
])
-
int8(
'I'
)
x4 :
=
int8(temp[
1
:
2
][
0
])
-
int8(
'O'
)
s :
=
fmt.Sprintf(
"%d%d%d%d"
, x1, x2, x3, x4)
nums, _ :
=
strconv.ParseInt(s,
10
,
0
)
switch lictype {
case SingleUserLicense:
if
nums >
1
{
return
false
}
case MultipleUserLicense:
if
nums <
1
|| nums >
4999
{
return
false
}
case CorporateSiteLicense:
if
nums !
=
4999
{
return
false
}
case CorporateWorldwideLicense:
if
nums <
50000
{
return
false
}
}
return
true
}
/
/
第一段注册码,随机生成
8
个大写字符
func GenerateCode1() string {
code1 :
=
func(n
int
) string {
letters :
=
[]rune(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
)
b :
=
make([]rune, n)
for
i :
=
range
b {
b[i]
=
letters[rand.Intn(
len
(letters))]
}
return
string(b)
}(
8
)
return
code1
}
/
/
第二段注册码,
8
个大写字符
func GenerateCode2(plain1, plain2 []byte) string {
c1 :
=
[]byte(
"me4T6cBLV"
)
c2 :
=
[]byte(
"CpCwxrvCJZ30pKLu8Svxjhnhut437glCpofVssnFeBh2G0ekUq4VcxFintMix52vL0iJNbdtWqHPyeumkDUC+4AaoSX+xpl56Esonk4="
)
c3 :
=
append(c1, plain1...)
c3
=
append(c3, c2...)
k1 :
=
KSHA1(c3)
plain :
=
make([]byte,
len
(plain2))
copy(plain, plain2)
plain
=
KBlowfish(plain, k1, make([]byte,
8
))
b64 :
=
KBase64(plain)
pp :
=
append(plain1, []byte(
"96332"
)...)
pp
=
append(pp, plain2...)
k2 :
=
KSHA512(pp)[:
16
]
cc :
=
KIDEA(b64, k2, make([]byte,
8
))
b64
=
KBase64(cc)
var lic string
for
_, v :
=
range
b64 {
if
unicode
.IsUpper(rune(v)) {
lic
+
=
string(v)
if
len
(lic) >
=
8
{
break
}
}
}
return
lic
}
/
/
生成第
3
段注册码,
4
个大写字符
func GenerateCode3(plain1, plain2 []byte) string {
temp :
=
append(plain1, []byte(
"96332"
)...)
temp
=
append(temp, plain2...)
k :
=
KSHA1(temp)[:
16
]
inter :
=
make([]byte,
len
(plain2))
round
:
=
plain1[
0
]
-
'2'
initial :
=
make([]byte,
8
)
for
i :
=
uint8(
0
); i <
=
round
; i
+
+
{
copy(inter, plain2)
KIDEA(inter, k, initial)
}
inter
=
KBase64(inter)
p1 :
=
[]byte(
"09232849248398340903834873297239340547237623242043324398489390309284343843223493299435"
)
hash
:
=
KSHA512(p1)[:
56
]
inter
=
KBlowfish(inter,
hash
, make([]byte,
8
))
b64 :
=
KBase64(inter)
var lic string
for
_, v :
=
range
b64 {
if
unicode
.IsUpper(rune(v)) {
lic
+
=
string(v)
}
if
len
(lic)
=
=
4
{
break
}
}
return
lic
}
type
EncryptRoutine func([]byte, []byte) []byte
func KAbstractEncrypt(plain, key, initial []byte, routine EncryptRoutine) []byte {
reset :
=
true
for
_, x :
=
range
initial {
if
x !
=
0
{
reset
=
false
break
}
}
var c []byte
if
reset
=
=
true {
c
=
routine(initial, key)
}
else
{
c
=
initial
}
/
/
循环加密
/
移位
/
异或明文
for
i :
=
0
; i <
len
(plain); i
+
+
{
ec :
=
routine(c, key)
copy(c, c[
1
:])
v :
=
plain[i] ^ ec[
0
]
c[
7
]
=
v
plain[i]
=
v
}
copy(initial, c)
return
plain
}
func KBlowfish(plain, key, initial []byte) []byte {
KAbstractEncrypt(plain, key, initial, blowfishEncrypt)
return
plain
}
func KIDEA(plain, key, initial []byte) []byte {
KAbstractEncrypt(plain, key, initial, ideaEncrypt)
return
plain
}
func KSHA1(text []byte) []byte {
h :
=
sha1.New()
h.Write(text)
hash
:
=
h.
Sum
(nil)
return
hash
}
func KSHA512(text []byte) []byte {
h :
=
sha512.New()
h.Write(text)
hash
:
=
h.
Sum
(nil)
return
hash
}
func KBase64(text []byte) []byte {
return
[]byte(base64.StdEncoding.EncodeToString(text))
}