写点什么

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

作者:宇宙之一粟
  • 2022 年 5 月 17 日
  • 本文字数:1248 字

    阅读完需:约 4 分钟

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

引言

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


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


import (        "crypto/aes"        "encoding/hex")
复制代码


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


使用 AES 加密消息

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



// cipher keykey := "thisis32bitlongpassphraseimusing" // plaintextpt := "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)}
复制代码

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


在 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 加密的密文。

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


完整代码

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

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 secret145149d64a1a3c4025e67665001a3167DECRYPTED: This is a secret
复制代码


发布于: 刚刚阅读数: 4
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Go 语言入门很简单:AES加密和解密_AES_宇宙之一粟_InfoQ写作社区