Go语言使用AES加密解密

Go语言提供了标准库中的crypto/aes包来支持AES加密和解密。下面是使用AES-128-CBC模式加密和解密的示例代码:

go 复制代码
package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
)

func main() {
    key := []byte("this is a 16 byte key")
    iv := []byte("this is a 16 byte iv")

    plaintext := []byte("hello world")

    // 加密
    ciphertext, err := encrypt(plaintext, key, iv)
    if err != nil {
        panic(err)
    }
    fmt.Printf("加密结果:%s\n", base64.StdEncoding.EncodeToString(ciphertext))

    // 解密
    decrypted, err := decrypt(ciphertext, key, iv)
    if err != nil {
        panic(err)
    }
    fmt.Printf("解密结果:%s\n", decrypted)
}

func encrypt(plaintext []byte, key []byte, iv []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    ciphertext := make([]byte, len(plaintext))
    mode := cipher.NewCBCEncrypter(block, iv)
    mode.CryptBlocks(ciphertext, plaintext)

    return ciphertext, nil
}

func decrypt(ciphertext []byte, key []byte, iv []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    plaintext := make([]byte, len(ciphertext))
    mode := cipher.NewCBCDecrypter(block, iv)
    mode.CryptBlocks(plaintext, ciphertext)

    return plaintext, nil
}

以上代码使用AES-128-CBC模式进行加密和解密,可以更换成其他AES模式,如AES-192-CBC或AES-256-CBC等,只需要更改密钥长度即可。注意,本示例代码中使用了base64编码对密文进行了格式化,如果您需要直接使用二进制密文,请忽略base64编码部分。

在AES加密和解密的过程中,需要使用到一些参数,以下是这些参数的作用解释:

1.Plaintext(明文):需要加密的原始数据。

2.Ciphertext(密文):加密后的数据。

3.Key(密钥):用于加密和解密的密钥,长度可以为16、24或32字节(即128位、192位或256位)。

4.IV(初始化向量):一段固定长度的随机数,用于增强AES加密的强度。IV的长度通常为16字节(即128位),它必须与密钥一起使用。

5.Block(块):AES加密和解密的基本单元,它的大小与密钥长度相关,例如使用128位密钥时,块的大小为128位(即16字节)。

6.Mode(模式):AES加密可以使用多种模式,如ECB、CBC、CFB、OFB等,每种模式都有其特定的加密规则和优缺点。

7.Padding(填充):由于AES加密的块大小通常为128位,而明文的长度可能不是块大小的整数倍,因此需要进行填充。常见的填充方式有PKCS#5和PKCS#7,它们可以保证明文长度为块大小的整数倍。

以上是AES加密和解密中一些重要的参数和概念,了解这些参数和概念可以帮助您更好地理解AES加密和解密的过程和实现。

相关推荐
揽星河..14 分钟前
【C语言】结构体
c语言·开发语言
孟陬15 分钟前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
GoGeekBaird19 分钟前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
2601_9669496530 分钟前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
码事漫谈33 分钟前
腾讯混元 Hy4 正式版发布了
后端
Mikko733 分钟前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
神仙别闹2 小时前
基于Python实现英词语自动对齐系统
开发语言·python
akinggw2 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
苍何2 小时前
DeepSeek的Super-agent 设计,和我们的工程实践
后端
Patrick_Wilson2 小时前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言