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)}