共计 1751 个字符,预计需要花费 5 分钟才能阅读完成。
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 main
import (
"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)
}
正文完