Go 语言入门很简单:AES 加密和解密

简介: Advanced Encryption Standard, AES 又名 Rijndael 是 NIST 于 2001 年创建的一种加密算法。它使用 128 位数据块进行加密,是一种对称块密码。在这篇文章中,我们将在 Go 中使用 AES 加密和解密数据。

引言

Advanced Encryption Standard, AES 又名 Rijndael 是 NIST 于 2001 年创建的一种加密算法。它使用 128 位数据块进行加密,是一种对称块密码。在这篇文章中,我们将在 Go 中使用 AES 加密和解密数据。


我们需要 crypto/aes 包才能使其工作。

import (
        "crypto/aes"
        "encoding/hex"
)

我们还将使用十六进制编码将数据编码为字符串。


使用 AES 加密消息

现在要使用加密,我们需要密钥是 32 位的。密钥将被发送到密码以对明文进行编码。

// cipher key
key := "thisis32bitlongpassphraseimusing"
// plaintext
pt := "This is a secret"
c := EncryptAES([]byte(key), pt)


这里的 EncryptAES 函数如下:

func EncryptAES(key []byte, plaintext string) string {
        // create cipher
    c, err := aes.NewCipher(key)
    CheckError(err)
        // allocate space for ciphered data
    out := make([]byte, len(plaintext))
        // encrypt
    c.Encrypt(out, []byte(plaintext))
        // return hex string
    return hex.EncodeToString(out)
}

打印密文时,它将产生如下输出:

image.png


在 AES 中解密消息


现在,我们将解密使用 AES 算法加密的消息。这是执行此操作的代码。

func DecryptAES(key []byte, ct string) {
    ciphertext, _ := hex.DecodeString(ct)
    c, err := aes.NewCipher(key)
    CheckError(err)
    pt := make([]byte, len(ciphertext))
    c.Decrypt(pt, ciphertext)
    s := string(pt[:])
    fmt.Println("DECRYPTED:", s)
}


此函数从十六进制字符串中解密 AES 加密的密文。

现在,当使用它时,它将产生如下输出:

image.png


完整代码

该程序的完整源代码如下。

package main
import (
    "crypto/aes"
    "encoding/hex"
    "fmt"
)
func main() {
    // cipher key
    key := "thisis32bitlongpassphraseimusing"
    // plaintext
    pt := "This is a secret"
    c := EncryptAES([]byte(key), pt)
    // plaintext
    fmt.Println(pt)
    // ciphertext
    fmt.Println(c)
    // decrypt
    DecryptAES([]byte(key), c)
}
func EncryptAES(key []byte, plaintext string) string {
    c, err := aes.NewCipher(key)
    CheckError(err)
    out := make([]byte, len(plaintext))
    c.Encrypt(out, []byte(plaintext))
    return hex.EncodeToString(out)
}
func DecryptAES(key []byte, ct string) {
    ciphertext, _ := hex.DecodeString(ct)
    c, err := aes.NewCipher(key)
    CheckError(err)
    pt := make([]byte, len(ciphertext))
    c.Decrypt(pt, ciphertext)
    s := string(pt[:])
    fmt.Println("DECRYPTED:", s)
}
func CheckError(err error) {
    if err != nil {
        panic(err)
    }
}

运行该代码,结果如下:

$ go run main.go         
This is a secret
145149d64a1a3c4025e67665001a3167
DECRYPTED: This is a secret
相关文章
|
11月前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
489 0
|
11月前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
447 0
|
11月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
758 43
Go语言深度解析:从入门到精通的完整指南
|
11月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
501 2
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
765 1
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
705 0
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
540 0
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
579 0
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
1641 0

热门文章

最新文章