mirror of
https://github.com/wonli/aqi.git
synced 2024-06-28 09:57:05 +08:00
64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package encrypt
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/base64"
|
|
"fmt"
|
|
|
|
"github.com/wonli/aqi/utils"
|
|
)
|
|
|
|
type Azdg struct {
|
|
cipherHash string
|
|
}
|
|
|
|
func NewAzdg(key string) *Azdg {
|
|
cipherHash := fmt.Sprintf("%x", md5.Sum([]byte(key)))
|
|
return &Azdg{cipherHash: cipherHash}
|
|
}
|
|
|
|
func (a *Azdg) Encrypt(sourceText string) string {
|
|
noise := utils.GetRandomString(32)
|
|
inputData := []byte(sourceText)
|
|
loopCount := len(inputData)
|
|
outData := make([]byte, loopCount*2)
|
|
|
|
for i, j := 0, 0; i < loopCount; i, j = i+1, j+1 {
|
|
outData[j] = noise[i%32]
|
|
j++
|
|
outData[j] = inputData[i] ^ noise[i%32]
|
|
}
|
|
|
|
return base64.RawURLEncoding.EncodeToString([]byte(a.cipherEncode(fmt.Sprintf("%s", outData))))
|
|
}
|
|
|
|
func (a *Azdg) Decrypt(sourceText string) string {
|
|
buf, err := base64.RawURLEncoding.DecodeString(sourceText)
|
|
if err != nil {
|
|
fmt.Printf("Decode(%q) failed: %v", sourceText, err)
|
|
return ""
|
|
}
|
|
|
|
inputData := []byte(a.cipherEncode(fmt.Sprintf("%s", buf)))
|
|
loopCount := len(inputData)
|
|
outData := make([]byte, loopCount)
|
|
|
|
var p int
|
|
for i, j := 0, 0; i < loopCount; i, j = i+2, j+1 {
|
|
p = p + 1
|
|
outData[j] = inputData[i] ^ inputData[i+1]
|
|
}
|
|
|
|
return fmt.Sprintf("%s", outData[:p])
|
|
}
|
|
|
|
func (a *Azdg) cipherEncode(sourceText string) string {
|
|
inputData := []byte(sourceText)
|
|
loopCount := len(inputData)
|
|
outData := make([]byte, loopCount)
|
|
for i := 0; i < loopCount; i++ {
|
|
outData[i] = inputData[i] ^ a.cipherHash[i%32]
|
|
}
|
|
return fmt.Sprintf("%s", outData)
|
|
}
|