SM2椭圆曲线公钥明码算法

SM2算法和RSA算法都是公钥明码算法,SM2算法是一种更先进平安的算法,SM2是国家明码局与2010年12月17日公布的椭圆曲线公钥明码算法,在咱们国家商用明码体系中被用来替换RSA算法。

SM2加解密

package mainimport (    "crypto/rand"    "github.com/tjfoc/gmsm/sm2"    "github.com/tjfoc/gmsm/x509"    "os")func GerenateSM2Key(){    //1.生成sm2密钥对    privateKey, err := sm2.GenerateKey(rand.Reader)    if err != nil {        panic(err)    }    //2.通过x509将私钥反序列化并进行pem编码    privateKeyToPem, err := x509.WritePrivateKeyToPem(privateKey, nil)    if err != nil {        panic(err)    }    //3.将私钥写入磁盘文件    file, err := os.Create("sm2Private.pem")    if err != nil {        panic(err)    }    defer file.Close()    _, err = file.Write(privateKeyToPem)    if err != nil {        panic(err)    }    //4.进行SM2公钥断言    publicKey := privateKey.Public().(*sm2.PublicKey)    //5.将公钥通过x509序列化并进行pem编码    publicKeyToPem, err := x509.WritePublicKeyToPem(publicKey)    if err != nil {        panic(err)    }    //6.将公钥写入磁盘文件    file, err = os.Create("sm2Public.pem")    if err != nil {        panic(err)    }    defer file.Close()    _, err = file.Write(publicKeyToPem)    if err != nil {        panic(err)    }}//加密func EncryptSM2(plainText []byte, pubFileName string) []byte {    //1.关上公钥文件读取公钥    file, err := os.Open(pubFileName)    if err != nil {        panic(err)    }    defer file.Close()    fileInfo, err := file.Stat()    if err != nil {        panic(err)    }    buf := make([]byte, fileInfo.Size())    _, err = file.Read(buf)    if err != nil {        panic(err)    }    //2.将pem格局公钥解码并反序列化    publicKeyFromPem, err := x509.ReadPublicKeyFromPem(buf)    if err != nil {        panic(err)    }    //3.加密    cipherText, err := publicKeyFromPem.EncryptAsn1(plainText, rand.Reader)    if err != nil {        panic(err)    }    return cipherText}//解密func DecryptSM2(cipherText []byte, priFileName string) []byte {    //1.关上私钥问价读取私钥    file, err := os.Open(priFileName)    if err != nil {        panic(err)    }    defer file.Close()    fileInfo, err := file.Stat()    if err != nil {        panic(err)    }    buf := make([]byte, fileInfo.Size())    _, err = file.Read(buf)    if err != nil {        panic(err)    }    //2.将pem格局私钥文件解码并反序列话    privateKeyFromPem, err := x509.ReadPrivateKeyFromPem(buf, nil)    if err != nil {        panic(err)    }    //3.解密    planiText, err := privateKeyFromPem.DecryptAsn1(cipherText)    if err != nil {        panic(err)    }    return planiText}func main(){    GerenateSM2Key()    src := []byte("这是应用SM2椭圆曲线算法进行数据加解密测试")    cipherText := EncryptSM2(src, "sm2Public.pem")    plainText := DecryptSM2(cipherText, "sm2Private.pem")    flag := bytes.Equal(plainText, src)    fmt.Println("解密是否胜利:", flag)}

SM2签名验签

package mainimport (    "crypto/rand"    "github.com/tjfoc/gmsm/sm2"    "github.com/tjfoc/gmsm/x509"    "os")func GerenateSM2Key(){    //1.生成sm2密钥对    privateKey, err := sm2.GenerateKey(rand.Reader)    if err != nil {        panic(err)    }    //2.通过x509将私钥反序列化并进行pem编码    privateKeyToPem, err := x509.WritePrivateKeyToPem(privateKey, nil)    if err != nil {        panic(err)    }    //3.将私钥写入磁盘文件    file, err := os.Create("sm2Private.pem")    if err != nil {        panic(err)    }    defer file.Close()    _, err = file.Write(privateKeyToPem)    if err != nil {        panic(err)    }    //4.进行SM2公钥断言    publicKey := privateKey.Public().(*sm2.PublicKey)    //5.将公钥通过x509序列化并进行pem编码    publicKeyToPem, err := x509.WritePublicKeyToPem(publicKey)    if err != nil {        panic(err)    }    //6.将公钥写入磁盘文件    file, err = os.Create("sm2Public.pem")    if err != nil {        panic(err)    }    defer file.Close()    _, err = file.Write(publicKeyToPem)    if err != nil {        panic(err)    }}//签名func SignSM2(plainText []byte, priFileName string) []byte {    //1.关上私钥问价读取私钥    file, err := os.Open(priFileName)    if err != nil {        panic(err)    }    defer file.Close()    fileInfo, err := file.Stat()    if err != nil {        panic(err)    }    buf := make([]byte, fileInfo.Size())    _, err = file.Read(buf)    if err != nil {        panic(err)    }    //2.将pem格局私钥文件解码并反序列话    privateKeyFromPem, err := x509.ReadPrivateKeyFromPem(buf, nil)    if err != nil {        panic(err)    }    //3.签名    sign, err := privateKeyFromPem.Sign(rand.Reader, plainText, crypto.SHA256)    if err != nil {        panic(err)    }    return sign}//验签func VerifySM2(plainText, signed []byte, pubFileName string) bool {    //1.关上公钥文件读取公钥    file, err := os.Open(pubFileName)    if err != nil {        panic(err)    }    defer file.Close()    fileInfo, err := file.Stat()    if err != nil {        panic(err)    }    buf := make([]byte, fileInfo.Size())    _, err = file.Read(buf)    if err != nil {        panic(err)    }    //2.将pem格局公钥解码并反序列化    publicKeyFromPem, err := x509.ReadPublicKeyFromPem(buf)    if err != nil {        panic(err)    }    //3.验签    verify := publicKeyFromPem.Verify(plainText, signed)    return verify}func main(){    src := []byte("这是应用SM2椭圆曲线算法进行的签名验签测试")    signSM2 := SignSM2(src, "sm2Private.pem")    flag := VerifySM2(src, signSM2, "sm2Public.pem")    fmt.Println("验签后果:", flag)}