Ir paquete de dependencia
go get -u github.com/tjfoc/gmsm
Algoritmo de criptografía de clave pública de curva elíptica SM2
SM2 Algoritmo criptográfico de clave pública de curva elíptica El algoritmo criptográfico de clave pública SM2 basado en curvas elípticas
sigue los números estándar de SM2: GM/T 0003.1-2012, GM/T 0003.2-2012, GM/T 0003.3-2012, GM/T 0003.4-2012,
Paquetes dependientes de GM/T 0003.5-2012, GM/T 0009-2012, GM/T 0010-2012 :github.com/tjfoc/gmsm/sm2
priv, err := sm2.GenerateKey(rand.Reader) // 生成密钥对
if err != nil {
log.Fatal(err)
}
msg := []byte("Tongji Fintech Research Institute")
pub := &priv.PublicKey
ciphertxt, err := pub.EncryptAsn1(msg,rand.Reader) //sm2加密
if err != nil {
log.Fatal(err)
}
fmt.Printf("加密结果:%x\n",ciphertxt)
plaintxt,err := priv.DecryptAsn1(ciphertxt) //sm2解密
if err != nil {
log.Fatal(err)
}
if !bytes.Equal(msg,plaintxt){
log.Fatal("原文不匹配")
}
sign,err := priv.Sign(rand.Reader, msg, nil) //sm2签名
if err != nil {
log.Fatal(err)
}
isok := pub.Verify(msg, sign) //sm2验签
fmt.Printf("Verified: %v\n", isok)
Algoritmo hash criptográfico SM3
Algoritmo hash criptográfico SM3: el
número estándar SM3 seguido del algoritmo hash criptográfico SM3 es:
Paquete dependiente de GM/T 0004-2012:github.com/tjfoc/gmsm/sm3
data := "test"
h := sm3.New()
h.Write([]byte(data))
sum := h.Sum(nil)
fmt.Printf("digest value is: %x\n",sum)
Algoritmo de cifrado de bloque SM4
Algoritmo de cifrado de bloques SM4: el número estándar SM4 seguido del algoritmo de cifrado de bloques SM4 es:
Paquete dependiente de GM/T 0002-2012:github.com/tjfoc/gmsm/sm4
import "crypto/cipher"
import "github.com/tjfoc/gmsm/sm4"
import "fmt"
func main(){
key := []byte("1234567890abcdef")
fmt.Printf("key = %v\n", key)
data := []byte{
0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}
fmt.Printf("key = %v\n", key)
fmt.Printf("data = %x\n", data)
iv := []byte("0000000000000000")
err = SetIV(iv)//设置SM4算法实现的IV值,不设置则使用默认值
ecbMsg, err :=sm4.Sm4Ecb(key, data, true) //sm4Ecb模式pksc7填充加密
if err != nil {
t.Errorf("sm4 enc error:%s", err)
return
}
fmt.Printf("ecbMsg = %x\n", ecbMsg)
ecbDec, err := sm4.Sm4Ecb(key, ecbMsg, false) //sm4Ecb模式pksc7填充解密
if err != nil {
t.Errorf("sm4 dec error:%s", err)
return
}
fmt.Printf("ecbDec = %x\n", ecbDec)
}