文章目录
- 前言
- 一、SM4是什么?
- 二、go语言实现
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、SM4是什么?
SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。相关标准为“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。
在商用密码体系中,SM4主要用于数据加密,其算法公开,分组长度与密钥长度均为128bit,加密算法与密钥扩展算法都采用32轮非线性迭代结构,S盒为固定的8比特输入8比特输出。
SM4.0中的指令长度被提升到大于64K(即64×1024)的水平,这是SM 3.0规格(渲染指令长度允许大于512)的128倍。
二、go语言实现
package mainimport ("crypto/cipher""demo1/utils""encoding/hex""fmt""github.com/tjfoc/gmsm/sm4"
)//sm4加密
//src:明文
//key:秘钥
func EncryptSm4(src, key []byte) []byte {block, err := sm4.NewCipher(key)if err != nil {panic(err)}src = utils.PaddingText(src, block.BlockSize())blockMode := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])dst := make([]byte, len(src))blockMode.CryptBlocks(dst, src)return dst
}//sm4解密
//src:密文
//key:秘钥
func DecryptSm4(src, key []byte) []byte {block, err := sm4.NewCipher(key)if err != nil {panic(err)}blockMode := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])dst := make([]byte, len(src))blockMode.CryptBlocks(dst, src)newText := utils.UnPaddingText(dst)return newText
}func main() {key := []byte("12345678abcdefgh")msg := []byte("wei")encrypt_msg := EncryptSm4(msg, key)fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))decrypt_msg := DecryptSm4(encrypt_msg, key)fmt.Println("decrypt_msg = ", string(decrypt_msg))
}