| @ -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) | |||||
| } | |||||