You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

116 lines
2.8 KiB

package crypto
/*
国密算法库 github.com/tjfoc/gmsm/ 封装
*/
import (
"bytes"
"crypto/rand"
"github.com/tjfoc/gmsm/sm2"
"github.com/tjfoc/gmsm/sm3"
"github.com/tjfoc/gmsm/sm4"
"github.com/tjfoc/gmsm/x509"
)
///生成密钥对
func GenerateKey(key string) (*sm2.PrivateKey, error) {
return sm2.GenerateKey(bytes.NewBufferString(key))
}
///读取私钥
func ReadPrivateKeyFromPem(privateKeyPem []byte, pwd []byte) (*sm2.PrivateKey, error) {
return x509.ReadPrivateKeyFromPem(privateKeyPem, pwd)
}
///读取私钥
func ReadPublicKeyFromPem(privateKeyPem []byte) (*sm2.PublicKey, error) {
return x509.ReadPublicKeyFromPem(privateKeyPem)
}
///国密—SM2-加密
func GM_SM2_Encry(origData []byte, pub *sm2.PublicKey) (ciphertext []byte, err error) {
ciphertext, err = pub.EncryptAsn1(origData, rand.Reader)
return
}
///国密—SM2-解密
func GM_SM2_Decry(ciphertext []byte, priv *sm2.PrivateKey) (origData []byte, err error) {
origData, err = priv.DecryptAsn1(ciphertext)
return
}
///国密—SM2-签名
func GM_SM2_Sign(origData, key string) (sign string, err error) {
var (
priv *sm2.PrivateKey
msg []byte
signdata []byte
)
if priv, err = sm2.GenerateKey(bytes.NewBufferString(key)); err != nil {
return
}
msg = []byte(origData)
if signdata, err = priv.Sign(rand.Reader, msg, nil); err != nil {
return
}
sign = string(signdata)
return
}
///国密—SM2-验签
func GM_SM2_Verify(origData, sign, key string) (isok bool, err error) {
var (
priv *sm2.PrivateKey
pub *sm2.PublicKey
)
if priv, err = sm2.GenerateKey(bytes.NewBufferString(key)); err != nil {
return
}
pub = &priv.PublicKey
isok = pub.Verify([]byte(origData), []byte(sign))
return
}
///国密—SM3-哈希
func GM_SM3_Hash(origData string) (hash string) {
h := sm3.New()
h.Write([]byte(origData))
hash = string(h.Sum(nil))
return
}
///国密-SM4-sm4Ecb模式pksc7填充加密
func GM_SM4_Ecb(origData string, key string) (ciphertext string, err error) {
var (
iv []byte
ecbdata []byte
)
iv = []byte("0000000000000000")
if err = sm4.SetIV(iv); err != nil { //设置SM4算法实现的IV值,不设置则使用默认值
return
}
if ecbdata, err = sm4.Sm4Ecb([]byte(key), []byte(origData), true); err != nil { //sm4Ecb模式pksc7填充加密
return
}
ciphertext = string(ecbdata)
return
}
///国密-SM4-sm4Ecb模式pksc7填充加密
func GM_SM4_Dec(ciphertext string, key string) (origData string, err error) {
var (
iv []byte
ecbdata []byte
)
iv = []byte("0000000000000000")
if err = sm4.SetIV(iv); err != nil { //设置SM4算法实现的IV值,不设置则使用默认值
return
}
if ecbdata, err = sm4.Sm4Ecb([]byte(key), []byte(ciphertext), false); err != nil { //sm4Ecb模式pksc7填充加密
return
}
origData = string(ecbdata)
return
}