Golang crypto.aes 包详解
crypto/aes
包提供了AES加密算法的实现。AES(Advanced Encryption Standard)是一种区块加密标准,设计来替代DES。
以下是使用crypto/aes
包进行AES加密和解密的基本示例:
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/base64"
"io"
"log"
)
func encrypt(text string) (string, error) {
key := []byte("32-byte-long-key-here") // AES-256
plaintext := []byte(text)
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
// IV must be unique, but does not have to be secret
var iv [aes.BlockSize]byte
if _, err := io.ReadFull(rand.Reader, iv[:]); err != nil {
return "", err
}
stream := cipher.NewCFBEncrypter(block, iv[:])
ciphertext := make([]byte, len(plaintext))
stream.XORKeyStream(ciphertext, plaintext)
// prepend the IV to the ciphertext
ciphertext = append(iv[:], ciphertext...)
return base64.StdEncoding.EncodeToString(ciphertext), nil
}
func decrypt(encryptedText string) (string, error) {
key := []byte("32-byte-long-key-here") // AES-256
ciphertext, err := base64.StdEncoding.DecodeString(encryptedText)
if err != nil {
return "", err
}
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
if len(ciphertext) < aes.BlockSize {
return "", err
}
iv := ciphertext[:aes.BlockSize]
ciphertext = ciphertext[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
plaintext := make([]byte, len(ciphertext))
stream.XORKeyStream(plaintext, ciphertext)
return string(plaintext), nil
}
func main() {
originalText := "Hello, AES!"
encryptedText, err := encrypt(originalText)
if err != nil {
log.Fatal(err)
}
log.Println("Encrypted Text:", encryptedText)
decryptedText, err := decrypt(encryptedText)
if err != nil {
log.Fatal(err)
}
log.Println("Decrypted Text:", decryptedText)
}
在这个示例中,我们定义了encrypt
和decrypt
函数来分别处理加密和解密。我们使用了CFB模式(Cipher Feedback),它适合在线加密。加密时,我们生成一个随机的初始化向量(IV),并将其附加到密文之前。解密时,我们从密文中提取出IV。
注意,在实际应用中,密钥应该是安全随机生成的,并且对于不同的消息需要使用不同的IV。此外,示例中的密钥长度为32字节,对应于AES-256。如果需要使用AES-128或AES-192,则密钥长度分别为16字节或24字节。
评论已关闭