package sm4
import (
"bytes"
"encoding/hex"
"github.com/tjfoc/gmsm/sm4"
)
func SM4EcbEncrypt(key, plaintext []byte) (string, error) {
block, err := sm4.NewCipher(key)
if err != nil {
return "", err
}
plaintext = PKCS5Padding(plaintext, block.BlockSize())
ciphertext := make([]byte, len(plaintext))
for start := 0; start < len(plaintext); start += block.BlockSize() {
block.Encrypt(ciphertext[start:start+block.BlockSize()], plaintext[start:start+block.BlockSize()])
}
return hex.EncodeToString(ciphertext), nil
}
func SM4EcbDecrypt(key []byte, data string) ([]byte, error) {
plaintext, _ := hex.DecodeString(data)
block, err := sm4.NewCipher(key)
if err != nil {
return nil, err
}
ciphertext := make([]byte, len(plaintext))
for start := 0; start < len(plaintext); start += block.BlockSize() {
block.Decrypt(ciphertext[start:start+block.BlockSize()], plaintext[start:start+block.BlockSize()])
}
ciphertext = PKCS5Unpadding(ciphertext)
return ciphertext, nil
}
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS5Unpadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
Golang实现SM4加解密,ECB模式,PKCS5填充
于 2024-06-11 15:45:35 首次发布