Go implementa algoritmos secretos nacionales SM2, SM3, SM4

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

Supongo que te gusta

Origin blog.csdn.net/lilongsy/article/details/131681173
Recomendado
Clasificación