密码技术--国密sm2椭圆曲线公钥密码算法及go语言应用

Yuan_sr      2022-02-11     234

关键词:

SM2椭圆曲线公钥密码算法

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

SM2加解密

package main

import (
    "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 main

import (
    "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)
}

sm系列国密算法(转)

...密算法(从零开始学区块链189)众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。其中SM1、SM4、SM7、祖冲之密码(ZUC... 查看详情

sm2椭圆曲线公钥密码算法

...。。。好复杂。分享下看哪位看得懂其中的原理 国家密码管理局于2010年12月17日发布了SM2椭圆曲线公钥密码算法,并要求为对现有基于RSA算法的电子认证系统、密钥管理系统、应用系统进行升级改造。关于算法标准,请参见... 查看详情

信息安全工程师笔记-国产密码算法(国密)概念

国产密码算法国产密码算法有SM1分组密码算法、SM2椭圆曲线公钥密码算法、SM3密码杂凑算法、SM4分组算法、SM9标识密码算法。算法名称算法特征描述SM1对称加密,分组长度和密钥长度都为128比特SM2非对称加密,用于公钥... 查看详情

国密算法介绍

...0c;可以通过“密钥”和“解密算法”将密文还原成明文。密码学中应用最为广泛的三类算法:对称算法(分组密码算法):AES/DES/SM4非对称算法(公钥密码算法):RSA/SM2摘要算法(杂凑算法)&#x... 查看详情

国密算法介绍

...0c;可以通过“密钥”和“解密算法”将密文还原成明文。密码学中应用最为广泛的三类算法:对称算法(分组密码算法):AES/DES/SM4非对称算法(公钥密码算法):RSA/SM2摘要算法(杂凑算法)&#x... 查看详情

sm2国密ssl证书为https加密提速

...输安全。SM2,正是一种由我国自主设计的非对称公钥密码算法,相较于RSA算法更加先进和安全的算法。什么是国密算法?国密算法是国家密码管理局制定的自主可控的国产算法,包括SM1、SM2、SM3、SM4、SM7、SM9、祖... 查看详情

密码学系列-国密sm2为什么不支持恢复公钥(代码片段)

...恢复出公钥,故不太适合将以太坊,EOS之类的公链代码底层密码库替换成国密库,因为它们的椭圆曲线验签采用的都是recover模式,而非verify模式.verify模式:输入签名,消息摘要,公钥;输出是否是该公钥对应的私钥做的签名recover模式:输入... 查看详情

密码学系列-国密sm2为什么不支持恢复公钥(代码片段)

...恢复出公钥,故不太适合将以太坊,EOS之类的公链代码底层密码库替换成国密库,因为它们的椭圆曲线验签采用的都是recover模式,而非verify模式.verify模式:输入签名,消息摘要,公钥;输出是否是该公钥对应的私钥做的签名recover模式:输入... 查看详情

2017-2018-220179216《网络攻防与实践》sm234算法

...法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法、密码杂凑SM3算法、分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等。国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM... 查看详情

sm2椭圆曲线公钥密码算法,完整c代码,前人栽树,后人乘凉

某电信安信息安全数学基础实验要求实现SM2椭圆曲线公钥密码算法这是基于mircal库实现的,没有mircal库的下载我以前的博客发的文件,根据教程在vs上搭建。一共四个文件 SM2.cSM2.hSM3.cSM3.hSM2.c#include<stdio.h>#include<stdl... 查看详情

fabricv2.2中使用的密码学算法和国密算法对应关系

1.国密算法常用的密码学可以分为:对称加密、非对称加密以及哈希算法1.1.Fabric密码学算法和国密算法对应关系根据原生Fabric项目中/bccsp/opts文件中可知,原生Fabric支持的密码学算法有对称加密AES,非对称加密ECDSA以及哈希算法SHA:密... 查看详情

centos7编译安装openssl1.1.1支持国密标准(代码片段)

...ps://github.com/openssl/openssl/pull/4552参考:中国×××制定的商业密码算法标准《GM/T0006-2012密码应用标识规范》定义国密算法OID标识《GB/T32907-2016SM4分组密码算法》(原GM/T0002-2012)《GB/T329??-2016SM2椭圆曲线公钥密码算法》(原GM/T0003-2012)《GB/T... 查看详情

国密算法

参考技术A国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。SM1为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。SM2为非对称... 查看详情

密码算法(sm1sm2sm3sm4同态加密密态计算隐私计算和安全多方计算)

文章目录SM1对称密码SM2椭圆曲线公钥密码算法SM3杂凑算法SM4对称算法同态加密密态计算和隐私计算安全多方计算技术安全多方计算的应用场景对称加密算法非对称加密算法(公钥加密)参考文章SM1、SM2、SM3和SM4为了保障... 查看详情

skf密码设备研究(代码片段)

SKF密码设备研究密码设备mTokenGM3000国密身份认证锁是龙脉科技自主研发设计支持国密算法、完全遵照国家密码管理局颁布的《智能IC卡及智能密码钥匙密码应用接口规范》要求设计的USBKey,采用国产高性能智能卡芯片,内置SSF33... 查看详情

椭圆曲线密码学ecc

??椭圆曲线密码学(Ellipticcurvecryptography),简称ECC,是一种建立公开密钥加密的算法,也就是非对称加密。类似的还有RSA,ElGamal算法等。ECC被公认为在给定密钥长度下最安全的加密算法。比特币中的公私钥生成以及签名算法ECDSA... 查看详情

国密算法密码长度才256位二进制,为啥能说是安全的?

平时说上千位密钥的算法是RSA算法,其它算法比如椭圆曲线算法并不一定需要那么长的密钥。使用多长的密钥考虑的是用公钥反推私钥的运算量,只要需要的运算量足够大超出现实中的硬件能力就可以了。事实上RSA算法再长的密... 查看详情

国密算法

算法分类国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。SM1为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。SM2为非对称加... 查看详情