SM4对称加密算法
SM4是我国采纳的一种分组明码规范,有国家明码局与2012年3月21日公布,秘钥长度和分组长度为128位。
go语言中利用
简略版本:其函数接口中已实现分组明码底层接口的调用
func sm4Sample(){ src := []byte("这是对称加密SM4的CBC模式加解密测试") key := []byte("1q2w3e4r5t6y7u8i") cipherText, err := sm4.Sm4Cbc(key, src, true) if err != nil { panic(err) } plainText, err := sm4.Sm4Cbc(key, cipherText, false) if err != nil { panic(err) } flag := bytes.Equal(src, plainText) fmt.Println("SM4疾速实现加解密,数据填充规范为pksc7,是否解密胜利:", flag)}
简单版本:本人实现数据填充和分组明码底层接口的调用
package mainimport ( "crypto/cipher" "github.com/tjfoc/gmsm/sm4")//明文数据填充func paddingLastGroup(plainText []byte, blockSize int) []byte { //1.计算最初一个分组中明文后须要填充的字节数 padNum := blockSize - len(plainText)%blockSize //2.将字节数转换为byte类型 char := []byte{byte(padNum)} //3.创立切片并初始化 newPlain := bytes.Repeat(char, padNum) //4.将填充数据追加到原始数据后 newText := append(plainText, newPlain...) return newText}//去掉明文前面的填充数据func unpaddingLastGroup(plainText []byte) []byte { //1.拿到切片中的最初一个字节 length := len(plainText) lastChar := plainText[length-1] //2.将最初一个数据转换为整数 number := int(lastChar) return plainText[:length-number]}func sm4Encrypt (plainText, key []byte) []byte { block, err := sm4.NewCipher(key) if err != nil { panic(err) } paddData := paddingLastGroup(plainText, block.BlockSize()) iv := []byte("12345678qwertyui") blokMode := cipher.NewCBCEncrypter(block, iv) cipherText := make([]byte, len(paddData)) blokMode.CryptBlocks(cipherText, paddData) return cipherText}func sm4Dectypt(cipherText, key []byte) []byte { block, err := sm4.NewCipher(key) if err != nil { panic(err) } iv := []byte("12345678qwertyui") blockMode := cipher.NewCBCDecrypter(block, iv) blockMode.CryptBlocks(cipherText, cipherText) plainText := unpaddingLastGroup(cipherText) return plainText}func main(){ src := []byte("这是对称加密SM4的CBC模式加解密测试") key := []byte("1q2w3e4r5t6y7u8i") cipherText := sm4Encrypt(src, key) plainText := sm4Dectypt(cipherText, key) flag := bytes.Equal(src, plainText) fmt.Println("解密是否胜利:", flag)}