技术文摘
Go语言里AES加密与解密数据的使用方法
2025-01-09 02:08:13 小编
Go语言里AES加密与解密数据的使用方法
在当今数字化时代,数据安全至关重要。AES(高级加密标准)作为一种广泛应用的对称加密算法,在Go语言中也有成熟的实现。下面我们就来深入了解一下Go语言里AES加密与解密数据的使用方法。
要使用AES加密,需要导入Go语言标准库中的“crypto/aes”包。在进行加密操作前,要确保密钥的长度是合法的。AES支持128位、192位和256位的密钥长度。
以下是一个简单的AES加密示例代码:
package main
import (
"crypto/aes"
"fmt"
)
func encrypt(plaintext, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err!= nil {
return nil, err
}
blockSize := block.BlockSize()
plaintext = pkcs7Padding(plaintext, blockSize)
ciphertext := make([]byte, len(plaintext))
mode := NewCBCEncrypter(block, key[:blockSize])
mode.CryptBlocks(ciphertext, plaintext)
return ciphertext, nil
}
func pkcs7Padding(data []byte, blockSize int) []byte {
padding := blockSize - len(data)%blockSize
padtext := make([]byte, len(data)+padding)
copy(padtext[:len(data)], data)
for i := len(data); i < len(padtext); i++ {
padtext[i] = byte(padding)
}
return padtext
}
在这段代码中,encrypt函数接受明文和密钥作为参数。首先通过aes.NewCipher创建一个AES加密块,然后对明文进行填充,最后使用CBC(Cipher Block Chaining)模式进行加密。
接下来是解密部分的代码:
func decrypt(ciphertext, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err!= nil {
return nil, err
}
blockSize := block.BlockSize()
if len(ciphertext)%blockSize!= 0 {
return nil, fmt.Errorf("ciphertext length is not a multiple of block size")
}
plaintext := make([]byte, len(ciphertext))
mode := NewCBCDecrypter(block, key[:blockSize])
mode.CryptBlocks(plaintext, ciphertext)
plaintext = pkcs7Unpadding(plaintext)
return plaintext, nil
}
func pkcs7Unpadding(data []byte) []byte {
length := len(data)
unpadding := int(data[length - 1])
return data[:(length - unpadding)]
}
decrypt函数与加密函数类似,先创建加密块,然后使用CBC模式进行解密,最后去除填充。
通过以上代码示例,我们可以看到在Go语言中实现AES加密与解密并不复杂。无论是保护用户敏感信息,还是在网络通信中确保数据安全,AES加密都能发挥重要作用。掌握这些方法,能为我们的程序提供更可靠的数据安全保障,在开发中更好地应对各种安全需求。