在Golang中进行AES加解密可以使用crypto/aes
包和crypto/cipher
包。以下是一个示例代码,演示了如何使用AES CBC模式进行加解密,并包含了IV偏移量。
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
)
func encrypt(key, iv, plaintext []byte) (string, error) {
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
paddedPlaintext := pkcs7Padding(plaintext, block.BlockSize())
ciphertext := make([]byte, len(paddedPlaintext))
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext, paddedPlaintext)
return base64.StdEncoding.EncodeToString(ciphertext), nil
}
func decrypt(key, iv []byte, ciphertext string) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
decodedCiphertext, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {
return nil, err
}
decryptedData := make([]byte, len(decodedCiphertext))
mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(decryptedData, decodedCiphertext)
return pkcs7Unpadding(decryptedData), nil
}
// 使用PKCS7填充方式对数据进行填充
func pkcs7Padding(data []byte, blockSize int) []byte {
padding := blockSize - (len(data) % blockSize)
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(data, padText...)
}
// 对使用PKCS7填充方式的数据进行去填充
func pkcs7Unpadding(data []byte) []byte {
length := len(data)
unpadding := int(data[length-1])
return data[:(length - unpadding)]
}
func main() {
key := []byte("0123456789ABCDEF") // 16字节密钥
iv := []byte("1234567890ABCDEF") // 16字节IV偏移量
plaintext := []byte("Hello, World!")
ciphertext, err := encrypt(key, iv, plaintext)
if err != nil {
fmt.Println("Encryption error:", err)
return
}
fmt.Println("Ciphertext:", ciphertext)
decryptedText, err := decrypt(key, iv, ciphertext)
if err != nil {
fmt.Println("Decryption error:", err)
return
}
fmt.Println("Decrypted Text:", string(decryptedText))
}
请注意,这里的示例使用了AES-128算法,使用了16字节的密钥和IV偏移量。你可以根据需要调整参数和填充方式。
内容由零声教学AI助手提供,问题来源于学员提问