Bartender 3 官网:https://www.macbartender.com

使用注册机前先替换公钥:

-----BEGIN PUBLIC KEY-----
MIHwMIGoBgcqhkjOOAQBMIGcAkEAraqakqaZAELLKQyPPRUKTlYunqoZqbsrP6A0
Y/k10/Fh4hSdqZrnajORjFOPUsNIiDCLMqlxqo8aK+R/gY23mQIVAKmoTu5eMxpP
c+wNxRCrLL8wfO7ZAkBcMGr4gMnFxmTRDpQknFOOjebwJ7OkVWpE9ZWMFutWcqpD
cAKfjtU1dwNK7IIt4hgytNXAExOzifrN06rY/zsbA0MAAkBdyDX92oQz9KdzyK+Q
Wqc3GA3T4sgBnjQEOL5uN5wpFdimNDJGtNly2btCRK/MbUWRi2k2P+EUqT8MCdkK
4uq8
-----END PUBLIC KEY-----

注册机源代码:

package main

import (
    "bytes"
    "crypto/dsa"
    "crypto/rand"
    "crypto/sha1"
    "encoding/asn1"
    "encoding/base32"
    "fmt"
    "golang.org/x/crypto/ssh"
    "io"
    "log"
    "math/big"
)

var dsaPrivateKey = []byte(`-----BEGIN DSA PRIVATE KEY-----
MIH4AgEAAkEAraqakqaZAELLKQyPPRUKTlYunqoZqbsrP6A0Y/k10/Fh4hSdqZrn
ajORjFOPUsNIiDCLMqlxqo8aK+R/gY23mQIVAKmoTu5eMxpPc+wNxRCrLL8wfO7Z
AkBcMGr4gMnFxmTRDpQknFOOjebwJ7OkVWpE9ZWMFutWcqpDcAKfjtU1dwNK7IIt
4hgytNXAExOzifrN06rY/zsbAkBdyDX92oQz9KdzyK+QWqc3GA3T4sgBnjQEOL5u
N5wpFdimNDJGtNly2btCRK/MbUWRi2k2P+EUqT8MCdkK4uq8AhUApXG/mJwJMVbC
AEUTY5sz07f2XKA=
-----END DSA PRIVATE KEY-----
`)

type dsaSignature struct {
    R, S *big.Int
}

func hashMessage(msg []byte) []byte {
    h := sha1.New()
    _, err := io.WriteString(h, string(msg))
    if err != nil {
        log.Fatalf("failed to hash message: %s", err)
    }
    return h.Sum(nil)
}

func sign(msg []byte) ([]byte, error) {
    privateKey, err := ssh.ParseRawPrivateKey(dsaPrivateKey)
    if err != nil {
        return nil, err
    }

    pk, ok := privateKey.(*dsa.PrivateKey)
    if !ok {
        return nil, fmt.Errorf("private key should be *rsa.PrivateKey")
    }

    r, s, _ := dsa.Sign(rand.Reader, pk, hashMessage(msg))

    signData, _ := asn1.Marshal(dsaSignature{r, s})

    //fmt.Println(hex.Dump(signData))

    return signData, nil
}

func base32Encode(data []byte) string {
    return base32.StdEncoding.EncodeToString(data)
}

func generate(userName string) string {
    // bytes.Buffer效率更高...
    var b bytes.Buffer
    b.Write([]byte("Bartender2,"))
    b.Write([]byte(userName))

    data, err := sign(b.Bytes())
    if err != nil {
        return ""
    }
    return base32Encode(data)
}

func main() {
    name := "www.chinapyg.com"
    fmt.Println("=================================================")
    fmt.Println("「name:」" + name)
    fmt.Println("「serial:」" + generate(name))
    fmt.Println("=================================================")
}

你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。