| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
55a671d281 | 增加SM2加解密,增加jwt | 1 year ago |
|
|
9b3f365324 | 增加des ECB模式加解密 | 1 year ago |
|
|
434052814e | 增加mod | 4 years ago |
|
|
70650e5c8f | 修复方法 | 4 years ago |
| @ -0,0 +1,101 @@ | |||
| package crypter | |||
| import ( | |||
| "encoding/base64" | |||
| "errors" | |||
| "crypto/des" | |||
| "encoding/hex" | |||
| ) | |||
| // ECB模式加密,返回16进制结果 | |||
| func TripleECBEncryptForHex(key, plaintext string) (string, error) { | |||
| keyBytes, err := base64.StdEncoding.DecodeString(key) | |||
| if err != nil { | |||
| return "", err | |||
| } | |||
| data := []byte(plaintext) | |||
| ciphertext, err := TripleECBEncrypt(keyBytes, data) | |||
| if err != nil { | |||
| return "", err | |||
| } | |||
| return hex.EncodeToString(ciphertext), nil | |||
| } | |||
| // ECB模式解密16进制密文 | |||
| func TripleECBDecryptFromHex(key, plaintext string) (string, error) { | |||
| keyBytes, err := base64.StdEncoding.DecodeString(key) | |||
| if err != nil { | |||
| return "", err | |||
| } | |||
| data, err := hex.DecodeString(plaintext) | |||
| if err != nil { | |||
| return "", err | |||
| } | |||
| ciphertext, err := TripleECBDecrypt(keyBytes, data) | |||
| if err != nil { | |||
| return "", err | |||
| } | |||
| return string(ciphertext), nil | |||
| } | |||
| // ECB模式加密,返回byte | |||
| func TripleECBEncrypt(key, plaintext []byte) ([]byte, error) { | |||
| // 创建Triple DES的块加密器 | |||
| block, err := des.NewTripleDESCipher(key) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| // 创建切片来存储加密后的密文 | |||
| ciphertext := make([]byte, len(plaintext)) | |||
| // 复制明文到切片中 | |||
| copy(ciphertext, plaintext) | |||
| // 应用PKCS#7填充 | |||
| ciphertext = PKCS5Padding(ciphertext, block.BlockSize()) | |||
| // 使用ECB模式加密填充后的数据 | |||
| for i := 0; i < len(ciphertext); i += block.BlockSize() { | |||
| block.Encrypt(ciphertext[i:i+block.BlockSize()], ciphertext[i:i+block.BlockSize()]) | |||
| } | |||
| return ciphertext, nil | |||
| } | |||
| // ECB模式解密,返回byte | |||
| func TripleECBDecrypt(key, ciphertext []byte) ([]byte, error) { | |||
| // 创建Triple DES的块加密器(解密时也需要这个) | |||
| block, err := des.NewTripleDESCipher(key) | |||
| if err != nil { | |||
| return []byte(""), err | |||
| } | |||
| // 检查密文长度是否是8字节的倍数 | |||
| if len(ciphertext)%des.BlockSize != 0 { | |||
| return []byte(""), errors.New("ciphertext is not a multiple of the block size") | |||
| } | |||
| // 创建一个buffer来存储解密后的明文 | |||
| plaintext := make([]byte, len(ciphertext)) | |||
| // 使用ECB模式解密 | |||
| for i := 0; i < len(ciphertext); i += block.BlockSize() { | |||
| block.Decrypt(plaintext[i:i+block.BlockSize()], ciphertext[i:i+block.BlockSize()]) | |||
| } | |||
| plaintext = PKCS5UnPadding(plaintext) | |||
| // 打印解密后的明文 | |||
| return plaintext, nil | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| package crypter | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_TripleECBEncrypt(t *testing.T) { | |||
| key := "7ejGP1WiZkgZ8VaIf6vBOBDFUnmByZiO" // 24字节的密钥 | |||
| data := "这是测试 This is test!=" // 明文 | |||
| d, err := TripleECBEncryptForHex(key, data) | |||
| t.Log(d) | |||
| t.Log(err) | |||
| } | |||
| func Test_TripleECBDecryptFromHex(t *testing.T) { | |||
| key := "7ejGP1WiZkgZ8VaIf6vBOBDFUnmByZiO" // 24字节的密钥 | |||
| key = "99ef199ddd11ff93d6927f755fd2b108" | |||
| msg := "0a7d96e2459dfa37cd13b8611acb26dd9adf31016bdb93da0d25d6a8041005e6" | |||
| msg = "AD2A27C86D0E6C0499BEEFDD60675129" | |||
| data, err := TripleECBDecryptFromHex(key, msg) | |||
| t.Log(data) | |||
| t.Log(err) | |||
| } | |||
| @ -0,0 +1,9 @@ | |||
| module git.tetele.net/tgo/crypter | |||
| go 1.14 | |||
| require ( | |||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect | |||
| github.com/tjfoc/gmsm v1.4.1 // indirect | |||
| golang.org/x/crypto v0.18.0 // indirect | |||
| ) | |||
| @ -0,0 +1,107 @@ | |||
| cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | |||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | |||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | |||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | |||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | |||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | |||
| github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | |||
| github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | |||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | |||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | |||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | |||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | |||
| github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | |||
| github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= | |||
| github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= | |||
| github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= | |||
| github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= | |||
| github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= | |||
| github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | |||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | |||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | |||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | |||
| github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= | |||
| github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= | |||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | |||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
| golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | |||
| golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= | |||
| golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= | |||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |||
| golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | |||
| golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | |||
| golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | |||
| golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | |||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
| golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
| golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
| golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | |||
| golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | |||
| golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | |||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | |||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
| golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |||
| golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |||
| golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |||
| golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |||
| golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= | |||
| golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | |||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | |||
| golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | |||
| golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= | |||
| golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= | |||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | |||
| golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | |||
| golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | |||
| golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | |||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | |||
| golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | |||
| golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | |||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | |||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | |||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | |||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | |||
| google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | |||
| google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= | |||
| google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | |||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | |||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | |||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | |||
| google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= | |||
| google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | |||
| google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | |||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
| @ -0,0 +1,128 @@ | |||
| package crypter | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| "log" | |||
| "strconv" | |||
| "time" | |||
| "github.com/dgrijalva/jwt-go" | |||
| ) | |||
| //JWT = JSON WEB TOKEN 是一个开放标准,用于作为json对象,在各个地方安全的传输信息 | |||
| //此信息可以被验证和信任 | |||
| func CreateJwtToken(client_id, client_secret string) (string, error) { | |||
| // Define the secret key used for signing the token | |||
| secretKey := []byte(client_secret) | |||
| // Create a new token with claims | |||
| token := jwt.New(jwt.SigningMethodHS256) | |||
| claims := token.Claims.(jwt.MapClaims) | |||
| // Set the issuer, issued at, and JWT ID claims | |||
| claims["iss"] = client_id | |||
| claims["iat"] = time.Now().Unix() | |||
| claims["jti"] = strconv.Itoa(time.Now().Nanosecond()) | |||
| // log.Println(claims) | |||
| // Sign the token with the secret key | |||
| tokenString, err := token.SignedString(secretKey) | |||
| if err != nil { | |||
| log.Println("Error signing token:", err) | |||
| return "", err | |||
| } | |||
| return tokenString, nil | |||
| } | |||
| func VerifyToken(tokenString string, client_id, client_secret string, expire int64) (bool, error) { | |||
| token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { | |||
| return []byte(client_secret), nil | |||
| }) | |||
| // log.Println(token, token.Claims, err) | |||
| if token.Valid { | |||
| claims := token.Claims.(jwt.MapClaims) | |||
| if client_id != claims["iss"] { | |||
| return false, errors.New("invalid client_id") | |||
| } | |||
| iat := ToInt64(claims["iat"]) | |||
| now := time.Now().Unix() | |||
| log.Println(iat, now) | |||
| if now-iat > expire || iat-now > expire { | |||
| return false, errors.New("invalid time") | |||
| } | |||
| return true, nil | |||
| } else if ve, ok := err.(*jwt.ValidationError); ok { | |||
| if ve.Errors&jwt.ValidationErrorMalformed != 0 { | |||
| return false, errors.New("Malformed token") | |||
| } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 { | |||
| return false, errors.New("Expired token") | |||
| } else { | |||
| return false, errors.New("Invalid token") | |||
| } | |||
| } else { | |||
| return false, errors.New("Invalid token") | |||
| } | |||
| } | |||
| func CheckJwtToken(tokenString string, client_secret string) (jwt.MapClaims, bool, error) { | |||
| // Define the secret key used for verifying the token | |||
| secretKey := []byte(client_secret) | |||
| // jwt.DecodeSegment() | |||
| // Parse the token | |||
| token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { | |||
| // Check the signing method | |||
| if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { | |||
| return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) | |||
| } | |||
| return secretKey, nil | |||
| }) | |||
| // Verify the token | |||
| if err != nil { | |||
| log.Println("Error parsing token:", err) | |||
| return nil, false, err | |||
| } | |||
| if token.Valid { | |||
| // log.Println("Token is valid!") | |||
| // Access the claims | |||
| claims := token.Claims.(jwt.MapClaims) | |||
| // log.Println("Issuer:", claims["iss"]) | |||
| // log.Println("Issued At:", claims["iat"]) | |||
| // log.Println("JWT ID:", claims["jti"]) | |||
| return claims, true, nil | |||
| } | |||
| return nil, false, nil | |||
| } | |||
| func ToInt64(inter interface{}) int64 { | |||
| var value int64 | |||
| switch inter.(type) { | |||
| case string: | |||
| value, _ = strconv.ParseInt(inter.(string), 10, 64) | |||
| case int: | |||
| value = int64(inter.(int)) | |||
| case int64: | |||
| value = inter.(int64) | |||
| case float64: | |||
| value_int, _ := strconv.Atoi(fmt.Sprintf("%1.0f", inter)) | |||
| value = int64(value_int) | |||
| case nil: | |||
| value = 0 | |||
| case interface{}: | |||
| if _, ok := inter.(int64); !ok { | |||
| value = inter.(int64) | |||
| } | |||
| default: | |||
| log.Println("参数值类型错误", inter, "not in string|int|float64|interface|int64") | |||
| } | |||
| return value | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| package crypter | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_VerifyToken(t *testing.T) { | |||
| token := "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5NzRjNzM1NjFhZTU0MjczIiwiaWF0IjoxNzExNzA1MTgwLCJqdGkiOiI3YzUzNGEyNi1jOTVmLTQ3NmQtYThjYS1lY2FjYTMxN2I1NDQifQ.h9JOqQOPN-xzTD7X5YPlS6YyshcixV329lEo_sX8tGw" | |||
| secret := "0f82962e24be4274a3b852f2d5b26f7e" | |||
| client_id := "974c73561ae54273" | |||
| ret, err := VerifyToken(token, client_id, secret, 600) | |||
| t.Log(ret) | |||
| t.Log(err) | |||
| } | |||
| @ -0,0 +1,138 @@ | |||
| package crypter | |||
| import ( | |||
| "crypto/rand" | |||
| "crypto/rsa" | |||
| "crypto/x509" | |||
| "encoding/base64" | |||
| "encoding/pem" | |||
| "errors" | |||
| "log" | |||
| "os" | |||
| ) | |||
| func RSA_Decode(encryptedData string, privateKey string) (string, error) { | |||
| // 解码PEM格式的私钥 | |||
| block, _ := pem.Decode([]byte(privateKey)) | |||
| if block == nil { | |||
| // fmt.Println("Failed to decode PEM private key") | |||
| return "", errors.New("私钥解码失败") | |||
| } | |||
| // 解析RSA私钥 | |||
| privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) | |||
| if err != nil { | |||
| log.Println("Failed to parse RSA private key", err) | |||
| return "", errors.New("私钥解析失败") | |||
| } | |||
| // 解密Base64编码的数据 | |||
| encryptedBytes, _ := base64.StdEncoding.DecodeString(encryptedData) | |||
| // 使用RSA私钥进行解密 | |||
| decryptedBytes, err := rsa.DecryptPKCS1v15(rand.Reader, privKey, encryptedBytes) | |||
| if err != nil { | |||
| // fmt.Println("Failed to decrypt data") | |||
| return "", errors.New("解密失败") | |||
| } | |||
| // 将解密后的字节转换为字符串 | |||
| return string(decryptedBytes), nil | |||
| } | |||
| func RSA_Encode(public_key string, msg string) (string, error) { | |||
| // publicKeyFile, err := ioutil.ReadFile(public_key) | |||
| // if err != nil { | |||
| // log.Println("Failed to read public key file:", err) | |||
| // return "", errors.New("没有公钥") | |||
| // } | |||
| block, _ := pem.Decode([]byte(public_key)) | |||
| if block == nil { | |||
| log.Println("Failed to decode public key PEM.") | |||
| return "", errors.New("公钥解码失败") | |||
| } | |||
| publicKey, err := x509.ParsePKIXPublicKey(block.Bytes) | |||
| if err != nil { | |||
| log.Println("Failed to parse public key:", err) | |||
| return "", errors.New("公钥解析失败") | |||
| } | |||
| rsaPublicKey, ok := publicKey.(*rsa.PublicKey) | |||
| if !ok { | |||
| log.Println("Failed to get RSA public key.") | |||
| return "", errors.New("公钥错误") | |||
| } | |||
| plainText := []byte(msg) | |||
| cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, plainText) | |||
| if err != nil { | |||
| log.Println("Failed to encrypt data:", err) | |||
| return "", errors.New("加密失败") | |||
| } | |||
| return string(cipherText), nil | |||
| } | |||
| func Create(private_pem_file, public_pem_file string) { | |||
| // 生成 RSA 密钥对 | |||
| privateKey, err := rsa.GenerateKey(rand.Reader, 2048) | |||
| if err != nil { | |||
| log.Println("无法生成私钥:", err) | |||
| return | |||
| } | |||
| // 将私钥保存到文件 | |||
| privateKeyFile, err := os.Create(private_pem_file) | |||
| if err != nil { | |||
| log.Println("无法创建私钥文件:", err) | |||
| return | |||
| } | |||
| defer privateKeyFile.Close() | |||
| privateKeyBlock := &pem.Block{ | |||
| Type: "RSA PRIVATE KEY", | |||
| Bytes: x509.MarshalPKCS1PrivateKey(privateKey), | |||
| } | |||
| err = pem.Encode(privateKeyFile, privateKeyBlock) | |||
| if err != nil { | |||
| log.Println("无法写入私钥文件:", err) | |||
| return | |||
| } | |||
| log.Println("私钥已保存到", private_pem_file) | |||
| // 生成公钥 | |||
| publicKey := &privateKey.PublicKey | |||
| // 将公钥保存到文件 | |||
| publicKeyFile, err := os.Create(public_pem_file) | |||
| if err != nil { | |||
| log.Println("无法创建公钥文件:", err) | |||
| return | |||
| } | |||
| defer publicKeyFile.Close() | |||
| publicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey) | |||
| if err != nil { | |||
| log.Println("无法编码公钥:", err) | |||
| return | |||
| } | |||
| publicKeyBlock := &pem.Block{ | |||
| Type: "PUBLIC KEY", | |||
| Bytes: publicKeyBytes, | |||
| } | |||
| err = pem.Encode(publicKeyFile, publicKeyBlock) | |||
| if err != nil { | |||
| log.Println("无法写入公钥文件:", err) | |||
| return | |||
| } | |||
| log.Println("公钥已保存到", public_pem_file) | |||
| } | |||
| @ -0,0 +1,101 @@ | |||
| package crypter | |||
| import ( | |||
| "encoding/base64" | |||
| "testing" | |||
| ) | |||
| // func Test_RSA(t *testing.T) { | |||
| // // 加密后的数据 | |||
| // encryptedData := "Zc8v6j8vzOQw4Ea9gA+gUgZr3I0AqjzH2aTf5wvJWtYF6HtQKzg2ZQgB9fQ6M2K1YW3J8Zr+I0w/3Y8uxR7e3bL7hYqT4A+1q8TJ6Dw0Ry1HlJ7iIgO1Zk5opxY2f9gBckmZj5yF3Z5F8IaLQXkWt9rH0c3s4tqCzUvq2Tj9v+1Sd7q8=" | |||
| // // RSA私钥 | |||
| // privateKey := `-----BEGIN RSA PRIVATE KEY----- | |||
| // MIICXQIBAAKBgQDlTj22J4wIEvJX9sWv6Z5iG0J/1HfD7Oe2Ry5AZfU9ZTzQ9uOJ | |||
| // dCt6M2xh9qyf5jJHnU7XKvH8WJN1wYr5X6zCqEVfA3n2i9U7jUwZ1CZtY0L6glNq | |||
| // sUxjWbsZoJg8l5nr7+D1U2Y0EoJf3z2w6h2H8Cd8d4j6s3wRlZ8m4uX6cwIDAQAB | |||
| // AoGBANZ4qM8Za7z1i2rH0t1a4XXg6b7y3nHyk3KvU8u7Qn8ZyFvW7C9+eIhYh5x7 | |||
| // iY9jXjA8eCjBxqVW3+4OjyA2F8H1sN3zq5sJ5XWV+8oZV0vNSm4fTfZcRf+o3R1i | |||
| // lNSGzY/7N1oDwWq7OQoqs3X6f0Tq7l3xU4DilK8C6e9a4G7KpXHvD9Nq2YqTlHlZ | |||
| // 2dGc2QaL6r8UfAiEA3Q5wQZaTfzR8l4R5o3l5pKkE+UQ3kqgX4yX7Cw8CQQD8Qq6 | |||
| // sVbYH3w9hQ1vXj4S0UkY4tZsVn3KjHb9EiGQ8o3T9WlKqX6k6cYs8r3F4Vn6wK32 | |||
| // aEk5eF7bAkEA6tWpYh2g3nWgWUJ8b5KdA1wLxR2JzrK4Z8LXZ8J+7R3k9TnT1D1r | |||
| // 5vqz7L5XqK7ZtT5KuYm8Hq8bq7AqzYcQMQJANrOq9GgM7QZzYwE+LsP4kL0WgJt6 | |||
| // E5yW2h5KmK4YUZq7J8vnLxqJwR1H5rNjQ6XK5Bb5G6tMj3q1jK5FzZG7MQJAbH4I | |||
| // yCJ6L/rz6GYz6Sxw0J3q0K6sWJdCvC3tXxTl6tDhI1C3rRgL2pV1Kxu6l3tT1Q3o | |||
| // AM4B5wJwJzJtL8x5rQJBAIq2j9NpLX9j6tB+1lKuZUw+5UW7Lh4GgYyFZGQw7zTm | |||
| // GrLl0Y+7K7uLd7uS9J2fOgXJz8n4X9B1CBs37f8d6Nw= | |||
| // -----END RSA PRIVATE KEY-----` | |||
| // ret, err := RSA(encryptedData, privateKey) | |||
| // t.Log(ret) | |||
| // t.Log(err) | |||
| // } | |||
| // func Test_Create(t *testing.T) { | |||
| // private_file := `D:\go\go-tmp\private.pem` | |||
| // public_file := `D:\go\go-tmp\public.pem` | |||
| // Create(private_file, public_file) | |||
| // } | |||
| func Test_RSA_Encode(t *testing.T) { | |||
| // public_key := `-----BEGIN PUBLIC KEY----- | |||
| // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArFP+5/AgprF3qHOgiJyI | |||
| // 798Yul7Ou2mlEBllv97cIIw0763O3BISc5+1io77q18qxEMAQEUwJeDR2GXKsGqY | |||
| // xS/YRxtCsHHs/y7bCLq/bFLGZGe7/tR5NQ54RjG8hGnRCGVqZVc8VItOofeldAO1 | |||
| // tZQw+iQUNtMPGuvRvo44xWqp/f5gI3T1BxwZjwepDS2ULO/pAIhhPKHGOWYS/DjR | |||
| // Zu6SmO+YKxqUQRLGd1+u1bBjh5ZQARvJkJVL3zXHJ4nTvKWpOTqSIUTprMZ/pGxu | |||
| // /79mukI/qxJ5py0UhMkkPuVUgIX6JhTWsSEmKTedlu9TWDdIhAsOzLmA0Nd9WR9W | |||
| // nQIDAQAB | |||
| // -----END PUBLIC KEY-----` | |||
| // ret, err := RSA_Encode(public_key, "ccc") | |||
| // t.Log(ret) | |||
| // t.Log(err) | |||
| // private_key := `-----BEGIN RSA PRIVATE KEY----- | |||
| // MIIEogIBAAKCAQEArFP+5/AgprF3qHOgiJyI798Yul7Ou2mlEBllv97cIIw0763O | |||
| // 3BISc5+1io77q18qxEMAQEUwJeDR2GXKsGqYxS/YRxtCsHHs/y7bCLq/bFLGZGe7 | |||
| // /tR5NQ54RjG8hGnRCGVqZVc8VItOofeldAO1tZQw+iQUNtMPGuvRvo44xWqp/f5g | |||
| // I3T1BxwZjwepDS2ULO/pAIhhPKHGOWYS/DjRZu6SmO+YKxqUQRLGd1+u1bBjh5ZQ | |||
| // ARvJkJVL3zXHJ4nTvKWpOTqSIUTprMZ/pGxu/79mukI/qxJ5py0UhMkkPuVUgIX6 | |||
| // JhTWsSEmKTedlu9TWDdIhAsOzLmA0Nd9WR9WnQIDAQABAoIBAA3GnS7/ZCzPLQib | |||
| // Ta7+DHhYdkqXv6D9vgM+dILVFvXHH4g1db7j9vOlRcbwzS+S6QFNddytaz7r7PqG | |||
| // kKBvtQy2WWy9wiQGx3JS1ZGqFBlduJxYKpAhfhr+sCC0YySWrO4l5U56nckIZd3O | |||
| // xTwz+7erRAsLDU6gqql1RowcJG+riJyEG3K8Dx42FiOtsL3n9vMoStArKQglhvc6 | |||
| // aDvri+Q/AldWjcKShvVhoJ45l10HkIpet/vANwNMC27zJTWMB/ssYHeTkRmDTrwZ | |||
| // X0X/6AFv/gfnelHpQUp3B2n+DlAOHKURsP2ithN44CrwXg+iz9fVv8VLLz/pb2Tm | |||
| // vFfOBGUCgYEA0ZT1Td0ekWQLeBMnuMmEMjlMKJ5Rxk7p//V3zl8izQOhagjZ3mZO | |||
| // eo/bkKAJbPu3CCaPA7PyDegy4QV34MR2DVrKRmRJ02xIWVsgHG/OVxHXR+oqYGdS | |||
| // yEYPYWr8SoZFwljt1a+N/teUOr63/UP6XL870QkIOCGLruLRuITEpoMCgYEA0n7L | |||
| // NgCVVWd9Sa+t4YbpyvSB49YrZ80yIAp/OcxyO7ZgI1FAIpOTr143KVbQSp3f3uzE | |||
| // iDwmB+jubT7DzgTOaSOin5KIPXUA2gkISxjnGLHBQBgxLEF5EvmbF16Hf0SZSDbS | |||
| // 01URusQ/fL9Zgxpg1QuKRHbPmiuDEsGZOrZuhF8CgYAg8rkJz6xhkQfYjbJd85hL | |||
| // yQQ3EoSql3dkHPQDxqMS9fInWFLgCtdlnz4WY4J31q60olMzctOn6gwtog1xkZE5 | |||
| // kj9gh52vlkNdgNzwe4dF2vEsRhz5YOT7xT/fwdD96lQHNLHXOS0qljugbKFCOLCg | |||
| // ahP+Tdwz7tol2VS9HGpJ/wKBgCUZofl3qtptriBxrWUFoWlbJRWiJu5ZtU7+aqQm | |||
| // S7AImfM/m908Q5hyM6i+m2G7Z7zj4FPevhlAzd1FZb+HC1ZuqHgVnJuwZqEHXIXX | |||
| // 8stgcR455VjWhV95zQMWby1YSuf2ebwzzzcq5cG3/C/mU1DZgtpEUpzqtGR26On3 | |||
| // Q41jAoGARkOpDEG4/Wm9k2No5GJDQ40kSwCAenjIJrz6Pk7FFaNjXePKMh2Keg7a | |||
| // N79uybBCD0yqJdFblR8DHpaIOIfz6lUHK8REycToo5X7WrOO2/zAUYa0v+Zaa+TK | |||
| // 298fm5UWMBWtwGj6gFnvwemdN5r01UqtkbNagNGxCjtZp6KSQCI= | |||
| // -----END RSA PRIVATE KEY-----` | |||
| // ret2, err := RSA_Decode(ret, private_key) | |||
| // t.Log(ret2) | |||
| // t.Log(err) | |||
| encodedStr := "MTIzNDU3ODlAJGVydDU=" | |||
| // 解码Base64字符串 | |||
| decodedBytes, err := base64.StdEncoding.DecodeString(encodedStr) | |||
| if err != nil { | |||
| t.Log("解码失败:", err) | |||
| return | |||
| } | |||
| // 将解码后的字节数组转换为字符串 | |||
| decodedStr := string(decodedBytes) | |||
| // 打印解密后的字符串 | |||
| t.Log(decodedStr) | |||
| } | |||
| @ -0,0 +1,82 @@ | |||
| package crypter | |||
| import ( | |||
| "encoding/hex" | |||
| "errors" | |||
| "log" | |||
| "strings" | |||
| "crypto/rand" | |||
| "fmt" | |||
| "github.com/tjfoc/gmsm/sm2" | |||
| "github.com/tjfoc/gmsm/x509" | |||
| ) | |||
| func Sm2EncryptWithHexKey(message string, public_key string) (string, error) { | |||
| sm2PubKey, err := x509.ReadPublicKeyFromHex(public_key) | |||
| if err != nil { | |||
| fmt.Println("Error parsing SM2 public key:", err) | |||
| return "", err | |||
| } | |||
| // 待加密的数据 | |||
| data := []byte(message) | |||
| // 使用SM2公钥加密数据 | |||
| ciphertext, err := sm2.Encrypt(sm2PubKey, data, rand.Reader, sm2.C1C3C2) | |||
| if err != nil { | |||
| log.Println("Error encrypting data with SM2:", err) | |||
| return "", errors.New("Error encrypting data with SM2," + err.Error()) | |||
| } | |||
| if err != nil { | |||
| log.Println("Error encrypting data with SM2:", err) | |||
| return "", errors.New("Error encrypting data with SM2") | |||
| } | |||
| return hex.EncodeToString(ciphertext), nil | |||
| // return base64.StdEncoding.EncodeToString(ciphertext), nil | |||
| } | |||
| func Sm2DecryptWithHexKey(message string, private_key string) (string, error) { | |||
| sm2PriKey, err := x509.ReadPrivateKeyFromHex(private_key) | |||
| if err != nil { | |||
| fmt.Println("Error parsing SM2 private key:", err) | |||
| return "", err | |||
| } | |||
| // 待加密的数据 | |||
| data, err := hex.DecodeString(message) //base64.StdEncoding.DecodeString(message) // | |||
| if err != nil { | |||
| fmt.Println("Error base64 message:", err) | |||
| return "", err | |||
| } | |||
| // 使用SM2私钥加密数据 | |||
| ciphertext, err := sm2.Decrypt(sm2PriKey, data, sm2.C1C3C2) | |||
| if err != nil { | |||
| log.Println("Error decrypting data with SM2:", err) | |||
| return "", errors.New("Error encrypting data with SM2:" + err.Error()) | |||
| } | |||
| return string(ciphertext), nil | |||
| } | |||
| func CreateHexKey() (string, string, error) { | |||
| // 生成SM2密钥对 | |||
| priv, err := sm2.GenerateKey(rand.Reader) | |||
| if err != nil { | |||
| return "", "", err | |||
| } | |||
| // 将私钥转换为PEM格式的字符串 | |||
| privPem := x509.WritePrivateKeyToHex(priv) | |||
| pubPem := x509.WritePublicKeyToHex(priv.Public().(*sm2.PublicKey)) | |||
| return strings.ToUpper(privPem), strings.ToUpper(pubPem), err | |||
| } | |||
| @ -0,0 +1,38 @@ | |||
| package crypter | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_Sm2EncryptWithHexKey(t *testing.T) { | |||
| publicKeyStr := "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEW8Jjr6PAAbt4CNLwy96IAFYqYzTYNXmFRP5WQIQHlVOyKwGt4mWvOp3cYIYLNPz4Zul+ssHGj6iIR5/g7/GPVQ==" | |||
| message := "Hello, SM2!" | |||
| // ret, err := Sm2Encrypt(message, publicKeyStr) | |||
| // //BB06ddYi5lZ375jb1SWVZz7TrohrDS2XBDxgbMSgK4/oltdKt7tZZ917uZ1BInmrjDhuYpgCXZ9Pm7MACv8jKBT2BeRYEa2bEoh5s9iu0pLkiEbCxEd0+rSQ7QzOTXjOuUMfv05abYImjg== | |||
| // t.Log(ret) | |||
| // t.Log(err) | |||
| publicKeyStr = "042CC19B64E0BD66F39636FD088CDB95B94FC0D6E8F859D6A3CE667EBEF27BAF0DC56EA45C8F48A9C820DB00D84445CF408A533986C2A26AF2A92C22C784A6F63E" | |||
| ret, err := Sm2EncryptWithHexKey(message, publicKeyStr) | |||
| t.Log(ret) | |||
| t.Log(err) | |||
| } | |||
| func Test_Sm2DecryptWithHexKey(t *testing.T) { | |||
| var private_key string = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgeCC1xjOtVEUPXf/sHWGamWnpV2GCJcFXDMNdjHoFXYegCgYIKoEcz1UBgi2hRANCAARbwmOvo8ABu3gI0vDL3ogAVipjNNg1eYVE/lZAhAeVU7IrAa3iZa86ndxghgs0/Phm6X6ywcaPqIhHn+Dv8Y9V" | |||
| // message := "BNw3kw95aBovbvkJQ5NgIQnfDP1xJwGHUii4LWTjmrxzE7zlXkh0Py8+K8XuMFnqJn+9n5VheFyCAwOPg1Iw4yB4CDyBW5hGOXDlXV0qe+iaSdRCFJYoz810HStXKKwRjHA1+L5FXHIU+Q==" | |||
| message := "04b45733bf34c3e11a52027e8f477ce107e3c5ce18e678583b849a05ac98d3bf50997e36539edf9e959a2b2aa3813037ce06da99fc13c5fc60741fce0a056af65abcfc0a3b1fc0969dcb29c8d609076a118fa72c8704f02c47faae45a5eea9dfa99e4e0a83a4954aa2eee089" | |||
| private_key = "4B906B75EB9979A1F2AB00AFC192F2E574451871A003D46B328F88D3EF487836" | |||
| ret, err := Sm2DecryptWithHexKey(message, private_key) | |||
| t.Log(ret) | |||
| t.Log(err) | |||
| } | |||
| func Test_CreateHexKey(t *testing.T) { | |||
| priv, pub, err := CreateHexKey() | |||
| t.Log(priv) | |||
| t.Log(pub) | |||
| t.Log(err) | |||
| } | |||