技术文摘
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加密都能发挥重要作用。掌握这些方法,能为我们的程序提供更可靠的数据安全保障,在开发中更好地应对各种安全需求。
- 疫情下生意难做 外滩大会上联合国副秘书长指“数字金融”为解药
- 蚂蚁集团 CEO 胡晓明:上市后投技术乃重中之重
- Python 操作 Word 别再问我啦
- 一文读懂 C 语言操作 sqlite3 的方法
- 移动前端开发与 Web 前端开发有何区别
- TensorFlow 新接口助力简化 ML 移动端开发流程
- 12.9K 的前端开源项目让我收获了什么?
- 基础架构即代码模板常见的五个风险
- 技术选型探讨 - Angular2 与 Vue2 对比
- 为何不选用 Rust ?
- 一次生产事故致使 30 万单消失
- SecOps 与 DevSecOps:差异何在?
- Javascript 小技巧查缺补漏笔记
- Python 实现优雅登录校园网的方法
- Java 对象内存布局解析