@ -0,0 +1,139 @@ | |||||
package crypter | |||||
import ( | |||||
"crypto/md5" | |||||
"encoding/base64" | |||||
"fmt" | |||||
"io" | |||||
"strconv" | |||||
"strings" | |||||
"time" | |||||
) | |||||
// SSO gxytoken authcode | |||||
// btype 加密or解密 bool true:加密 false:解密 默认false | |||||
// skey 秘钥 | |||||
// text 加/解密内容 | |||||
func AuthCode(text, skey string, btype bool) string { | |||||
isEncode := btype | |||||
key := skey | |||||
expiry := 0 | |||||
cKeyLen := 4 | |||||
timestamp := time.Now().Unix() | |||||
// md5加密key | |||||
mKey := Md5Sum(key) | |||||
// 参与加密的 | |||||
keyA := Md5Sum(mKey[0:16]) | |||||
// 用于验证数据有效性的 | |||||
keyB := Md5Sum(mKey[16:]) | |||||
// 动态部分 | |||||
var keyC string | |||||
if cKeyLen > 0 { | |||||
if isEncode { | |||||
// 加密的时候,动态获取一个秘钥 | |||||
keyC = Md5Sum(fmt.Sprint(timestamp))[32-cKeyLen:] | |||||
} else { | |||||
// 解密的时候从头部获取动态秘钥部分 | |||||
keyC = text[0:cKeyLen] | |||||
} | |||||
} | |||||
// 加入了动态的秘钥 | |||||
cryptKey := keyA + Md5Sum(keyA+keyC) | |||||
// 秘钥长度 | |||||
keyLen := len(cryptKey) | |||||
if isEncode { | |||||
// 加密 前10位是过期验证字符串 10-26位字符串验证 | |||||
var d int64 | |||||
if expiry > 0 { | |||||
d = timestamp + int64(expiry) | |||||
} | |||||
text = fmt.Sprintf("%010d%s%s", d, Md5Sum(text + keyB)[0:16], text) | |||||
} else { | |||||
// 解密 | |||||
//res, _ := base64.StdEncoding.DecodeString(text[cKeyLen:]) | |||||
res := Base64Decode(text[cKeyLen:]) | |||||
text = string(res) | |||||
} | |||||
// 字符串长度 | |||||
textLen := len(text) | |||||
if textLen <= 0 { | |||||
return "" | |||||
} | |||||
// 密匙簿(0-256) | |||||
box := make([]int, 0) | |||||
for i := 0; i < 256; i++ { | |||||
box = append(box, i) | |||||
} | |||||
// 对称算法 | |||||
var rndKey []int | |||||
cryptKeyB := []byte(cryptKey) | |||||
for i := 0; i < 256; i++ { | |||||
pos := i % keyLen | |||||
rndKey = append(rndKey, int(cryptKeyB[pos])) | |||||
} | |||||
j := 0 | |||||
for i := 0; i < 256; i++ { | |||||
j = (j + box[i] + rndKey[i]) % 256 | |||||
box[i], box[j] = box[j], box[i] | |||||
} | |||||
textB := []byte(text) | |||||
a := 0 | |||||
j = 0 | |||||
var result []byte | |||||
for i := 0; i < textLen; i++ { | |||||
a = (a + 1) % 256 | |||||
j = (j + box[a]) % 256 | |||||
box[a], box[j] = box[j], box[a] | |||||
result = append(result, byte(int(textB[i])^(box[(box[a]+box[j])%256]))) | |||||
} | |||||
if isEncode { | |||||
return keyC + strings.Replace(base64.StdEncoding.EncodeToString(result), "=", "", -1) | |||||
} | |||||
// 获取前10位,判断过期时间 | |||||
d, err := strconv.ParseInt(string(result[0:10]), 10, 64) | |||||
if err != nil { | |||||
d = 0 | |||||
} | |||||
fmt.Println(string(result[10:26]), Md5Sum(string(result[26:]) + keyB)[0:16]) | |||||
if (d == 0 || d-timestamp > 0) && string(result[10:26]) == Md5Sum(string(result[26:]) + keyB)[0:16] { | |||||
return string(result[26:]) | |||||
} | |||||
fmt.Println(string(result[26:])) | |||||
return "" | |||||
} | |||||
//MD5SUm | |||||
func Md5Sum(str string) string { | |||||
h := md5.New() | |||||
io.WriteString(h, str) | |||||
return fmt.Sprintf("%x", h.Sum(nil)) | |||||
} | |||||
//Base64Decode | |||||
func Base64Decode(str string) []byte { | |||||
var sdec []byte | |||||
var err error | |||||
x := len(str) * 3 % 4 | |||||
fmt.Println(x) | |||||
switch { | |||||
case x == 2: | |||||
str += "==" | |||||
case x == 1: | |||||
str += "=" | |||||
} | |||||
if sdec, err = base64.StdEncoding.DecodeString(str); err != nil { | |||||
return sdec | |||||
} | |||||
return sdec | |||||
} |
@ -0,0 +1,25 @@ | |||||
package crypter | |||||
import ( | |||||
"fmt" | |||||
"testing" | |||||
) | |||||
func Test_AuthCodeDec(t *testing.T) { | |||||
str := "18175" | |||||
key := "1509930887" | |||||
isencode := true | |||||
ret := AuthCode(str, key, isencode) | |||||
fmt.Println(str, "加密结果 ret:", ret) | |||||
} | |||||
func Test_AuthCodeEnc(t *testing.T) { | |||||
str := "1fa9Vsp7e91Pg9z8xorzO55lSbLcHZbNt9z10K8d7TEZZg" | |||||
key := "1509930887" | |||||
isencode := false | |||||
ret := AuthCode(str, key, isencode) | |||||
fmt.Println(str, "解密结果 ret:", ret) | |||||
} |
@ -0,0 +1,230 @@ | |||||
// DES、3DES加解密示例, | |||||
package crypter | |||||
import ( | |||||
"bytes" | |||||
"crypto/cipher" | |||||
"crypto/des" | |||||
"encoding/base64" | |||||
"encoding/hex" | |||||
"errors" | |||||
"log" | |||||
"strings" | |||||
) | |||||
const KEYS = "gfe023u_sefiel#fi32lf3z!" //必须24位 | |||||
/** | |||||
* 加密并转换为base64字符串 | |||||
*/ | |||||
func DesEncrypt(args ...string) (string, error) { //origData, key []byte | |||||
code, keyorg, err := getArgs(args) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
key := keyorg[0:8] | |||||
block, err := des.NewCipher(key) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
origData := []byte(code) | |||||
origData = PKCS5Padding(origData, block.BlockSize()) | |||||
blockMode := cipher.NewCBCEncrypter(block, key) | |||||
crypted := make([]byte, len(origData)) | |||||
// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以 | |||||
// crypted := origData | |||||
blockMode.CryptBlocks(crypted, origData) | |||||
encode := base64.StdEncoding.EncodeToString(crypted) | |||||
return encode, nil | |||||
} | |||||
/** | |||||
* 加密并转换为16进制字符串 | |||||
*/ | |||||
func DesEn(code, key string) string { | |||||
block, err := des.NewCipher([]byte(key)) | |||||
if err != nil { | |||||
return "" | |||||
} | |||||
origData := []byte(code) | |||||
origData = PKCS5Padding(origData, block.BlockSize()) | |||||
blockMode := cipher.NewCBCEncrypter(block, []byte(key)) | |||||
crypted := make([]byte, len(origData)) | |||||
// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以 | |||||
// crypted := origData | |||||
blockMode.CryptBlocks(crypted, origData) | |||||
return strings.ToUpper(hex.EncodeToString(crypted)) | |||||
} | |||||
/** | |||||
* 解密已转为base64字符串有DES加密 | |||||
*/ | |||||
func DesDecrypt(args ...string) (string, error) { | |||||
decode, keyorg, err := getArgs(args) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
key := keyorg[0:8] | |||||
crypted, err := base64.StdEncoding.DecodeString(decode) | |||||
block, err := des.NewCipher([]byte(key)) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
blockMode := cipher.NewCBCDecrypter(block, key) | |||||
if len(crypted)%blockMode.BlockSize() != 0 { | |||||
return "", errors.New("error,input not full blocks") | |||||
} | |||||
origData := make([]byte, len(crypted)) | |||||
blockMode.CryptBlocks(origData, crypted) | |||||
origData = PKCS5UnPadding(origData) | |||||
return string(origData), nil | |||||
} | |||||
/** | |||||
* 解密已转为16进制字符串有DES加密 | |||||
*/ | |||||
func DesDe(code, key string) string { | |||||
crypted, err := hex.DecodeString(code) | |||||
if err != nil { | |||||
return "" | |||||
} | |||||
block, err := des.NewCipher([]byte(key)) | |||||
if err != nil { | |||||
return "" | |||||
} | |||||
blockMode := cipher.NewCBCDecrypter(block, []byte(key)) | |||||
if len(crypted)%blockMode.BlockSize() != 0 { | |||||
return "" | |||||
} | |||||
origData := make([]byte, len(crypted)) | |||||
blockMode.CryptBlocks(origData, crypted) | |||||
origData = PKCS5UnPadding(origData) | |||||
return string(origData) | |||||
} | |||||
// 3DES加密, 可与php MCRYPT_3DES加密方式对应 | |||||
func TripleDesEncrypt(args ...string) (string, error) { | |||||
code, key, err := getArgs(args) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
if code == "" { | |||||
return "", errors.New("加密数据为空") | |||||
} | |||||
block, err := des.NewTripleDESCipher(key) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
origData := []byte(code) | |||||
origData = PKCS5Padding(origData, block.BlockSize()) | |||||
blockMode := cipher.NewCBCEncrypter(block, key[:8]) | |||||
crypted := make([]byte, len(origData)) | |||||
blockMode.CryptBlocks(crypted, origData) | |||||
encode := base64.StdEncoding.EncodeToString(crypted) | |||||
return encode, nil | |||||
} | |||||
// 3DES解密 | |||||
func TripleDesDecrypt(args ...string) (string, error) { | |||||
decode, key, err := getArgs(args) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
if decode == "" { | |||||
return "", errors.New("解密数据为空") | |||||
} | |||||
block, err := des.NewTripleDESCipher(key) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
crypted, decodeErr := base64.StdEncoding.DecodeString(decode) | |||||
if decodeErr != nil { | |||||
return "", decodeErr | |||||
} | |||||
blockMode := cipher.NewCBCDecrypter(block, key[:8]) | |||||
origData := make([]byte, len(crypted)) | |||||
if len(crypted)%blockMode.BlockSize() != 0 { | |||||
log.Println("ERROR", "TripleDesDecrypt: input not full blocks") | |||||
return "", errors.New("解密失败") | |||||
} | |||||
blockMode.CryptBlocks(origData, crypted) | |||||
origData = PKCS5UnPadding(origData) | |||||
return string(origData), nil | |||||
} | |||||
//获取参数 | |||||
func getArgs(args []string) (string, []byte, error) { | |||||
if len(args) == 0 { | |||||
return "", nil, errors.New("参数不能为空") | |||||
} | |||||
origData := args[0] | |||||
var crypt_key string | |||||
if len(args) == 2 { | |||||
crypt_key = args[1] | |||||
} else { | |||||
crypt_key = KEYS | |||||
} | |||||
key := []byte(crypt_key) | |||||
return origData, key, nil | |||||
} | |||||
func ZeroPadding(ciphertext []byte, blockSize int) []byte { | |||||
padding := blockSize - len(ciphertext)%blockSize | |||||
padtext := bytes.Repeat([]byte{0}, padding) | |||||
return append(ciphertext, padtext...) | |||||
} | |||||
func ZeroUnPadding(origData []byte) []byte { | |||||
return bytes.TrimRightFunc(origData, func(r rune) bool { | |||||
return r == rune(0) | |||||
}) | |||||
} | |||||
func PKCS5Padding(ciphertext []byte, blockSize int) []byte { | |||||
padding := blockSize - len(ciphertext)%blockSize | |||||
padtext := bytes.Repeat([]byte{byte(padding)}, padding) | |||||
return append(ciphertext, padtext...) | |||||
} | |||||
func PKCS5UnPadding(origData []byte) []byte { | |||||
length := len(origData) | |||||
// 去掉最后一个字节 unpadding 次 | |||||
unpadding := int(origData[length-1]) | |||||
if length < unpadding || unpadding/8 > 3 { | |||||
//解密的是错误的数据情况下,是没有填充的 | |||||
return []byte("") | |||||
} | |||||
return origData[:(length - unpadding)] | |||||
} |
@ -0,0 +1,69 @@ | |||||
package crypter | |||||
import ( | |||||
"fmt" | |||||
"testing" | |||||
) | |||||
//func Test_DesEncrypt(t *testing.T) { | |||||
// str := "123456789" | |||||
// key := "DBPHW3K9" | |||||
// ret, err := DesEncrypt(str, key) | |||||
// fmt.Println(ret) | |||||
// fmt.Println(err) | |||||
//} | |||||
//func Test_DesDecrypt(t *testing.T) { | |||||
// str := "54291b8fa850aca3fb102569e569718797" | |||||
// key := "DBPHW3K9" | |||||
// ret, err := DesDecrypt(str, key) | |||||
// fmt.Println("ret:", ret) | |||||
// fmt.Println(err) | |||||
//} | |||||
//func Test_DesEn(t *testing.T) { | |||||
// str := "rdesktop 10.0.66.21 -f -u username" | |||||
// key := "2boscl0z" | |||||
// en := DesEn(str, key) | |||||
// fmt.Println(en) | |||||
// fmt.Println(str) | |||||
//} | |||||
//func Test_DesDe(t *testing.T) { | |||||
// str := "CD3A229D828AC38784064B2A1CCDEAD803D859DE60B20AE4FE81D27F59B64D39E3D09545EFDAFBB644C779872E1EB86B14742FE6A267D69AFD5888256F9D11D6D86EAECBCB2F0475E83432721DEF3BC60393C382F74B8BB7" | |||||
// fmt.Println(str) | |||||
// key := "LD13EY1R" | |||||
// de := DesDe(str, key) | |||||
// fmt.Println(" 数据 :", de) | |||||
//} | |||||
//func Test_TripleDesEncrypt(t *testing.T) { | |||||
// // DogKey := "FP4FSSJ5" | |||||
// // key := DogKey + "gi$01Lzy" + DogKey | |||||
// kenEncode, err := TripleDesEncrypt("control-hdraydesktop") | |||||
// t.Log(kenEncode) | |||||
// t.Log(err) | |||||
//} | |||||
func Test_TripleDesDecrypt(t *testing.T) { | |||||
str := "7fXpywgiF25K" | |||||
DogKey := "FP4FSSJ5" | |||||
key := DogKey + "gi$01Lzy" + DogKey | |||||
de, err := TripleDesDecrypt(str, key) //, "8JTE41BA8JTE41BA8JTE41BA" | |||||
fmt.Println(de, err) | |||||
t.Log(de) | |||||
de, err = TripleDesDecrypt("n7BCRSXtDUKv/RwRgu1s7j/FRg3v+TG9UFEqx7f+BPTuhl0Nm3GMRxbh/8JDxVH0zwJoQZOLUtnBkuchs2EaM9qNVLpIjF4fsoKMerlCbc1PY4mTKNdszzyTG31Nq/a0yrPrxInzsEBej8zrBLXBY0Ub7fO/aPQSxcEoTXK2/NmJI2r6y/LXfnmUeQ5/nBQuAOkP94mjVvyJi40wqGb0f7ae8Y3PoDONmM1JbGNVl0R0LMLQtLcqK914Ls8YQY3OZRBGmZtRQ5ZDbqyXCBCl6igsuZzmN+q8FyXjyzeAdWtlvbQtW1FROFNXXS3qExYx2a137l+szQGfWUpYvP9Egdx2YixxsIrZNEjQQVQzJkM=") //, "8JTE41BA8JTE41BA8JTE41BA" | |||||
fmt.Println(de, err) | |||||
} | |||||
//func Test_Md5Password(t *testing.T) { | |||||
// str := "123456" | |||||
// one := Md5Password(str, "") | |||||
// fmt.Println("md5 123456", one) | |||||
//} |
@ -0,0 +1,22 @@ | |||||
/* | |||||
* For crypter md5 | |||||
*/ | |||||
package crypter | |||||
import ( | |||||
"crypto/md5" | |||||
"encoding/hex" | |||||
) | |||||
//密码加密 | |||||
func Md5Password(password string, rand ...string) string { | |||||
if len(rand) > 0 { | |||||
password += rand[0] | |||||
} | |||||
h := md5.New() | |||||
h.Write([]byte(password)) // 需要加密的字符串 | |||||
cipher2Str := h.Sum(nil) | |||||
sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 | |||||
return sMd5 | |||||
} |
@ -0,0 +1,20 @@ | |||||
package crypter | |||||
import ( | |||||
"crypto/hmac" | |||||
"fmt" | |||||
"golang.org/x/crypto/ripemd160" | |||||
) | |||||
func EncryptedToken(token, key string) string { | |||||
h2 := hmac.New(ripemd160.New, []byte(key)) | |||||
h2.Write([]byte(token)) | |||||
hashBytes := h2.Sum(nil) | |||||
hashString := fmt.Sprintf("%x", hashBytes) | |||||
return hashString | |||||
} |
@ -0,0 +1,15 @@ | |||||
package crypter | |||||
import ( | |||||
// "fmt" | |||||
"testing" | |||||
) | |||||
func Test_EncryptedToken(t *testing.T) { | |||||
//2a12d5373e04a96c2e1862f786e9d054464fc13d | |||||
// fmt.Println([]byte("2a12d5373e04a96c2e1862f786e9d054464fc13d")) | |||||
token := "8d9a0183-ef9c-4ea6-bcf7-ab562ff4ac57" | |||||
key := "i3d6o32wo8fvs1fvdpwens" | |||||
ret := EncryptedToken(token, key) | |||||
t.Log(ret) | |||||
} |