一文掌握 Golang 加密:crypto/cipher 标准库全面指南
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"io"
"log"
"os"
)
func encrypt(plaintext []byte) ([]byte, error) {
block, err := aes.NewCipher([]byte("1234567890123456")) // 密钥长度必须是16、24或32字节
if err != nil {
return nil, err
}
plaintext = pad(plaintext, aes.BlockSize)
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return nil, err
}
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
return ciphertext, nil
}
func decrypt(ciphertext []byte) ([]byte, error) {
block, err := aes.NewCipher([]byte("1234567890123456"))
if err != nil {
return nil, err
}
if len(ciphertext) < aes.BlockSize {
return nil, err
}
iv := ciphertext[:aes.BlockSize]
ciphertext = ciphertext[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(ciphertext, ciphertext)
return unpad(ciphertext), nil
}
func main() {
// 示例代码使用
originalText := []byte("Hello, this is a secret message!")
encrypted, err := encrypt(originalText)
if err != nil {
log.Fatal(err)
}
os.Stdout.Write(encrypted)
decrypted, err := decrypt(encrypted)
if err != nil {
log.Fatal(err)
}
os.Stdout.Write(decrypted)
}
这段代码展示了如何使用Go标准库crypto/aes
和crypto/cipher
进行AES加密和解密。首先,我们创建了一个密钥,然后使用随机初始化向量(IV)。接着,我们创建了一个新的AES块加密器,并使用CFB模式进行加密和解密。最后,我们展示了如何使用这些函数进行加密和解密操作。
评论已关闭