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

举报
宇宙之一粟 发表于 2022/05/27 15:15:36 2022/05/27
【摘要】 引言Advanced Encryption Standard, AES 又名 Rijndael 是 NIST 于 2001 年创建的一种加密算法。它使用 128 位数据块进行加密,是一种对称块密码。在这篇文章中,我们将在 Go 中使用 AES 加密和解密数据。我们需要 crypto/aes 包才能使其工作。import ( "crypto/aes" "encodi...

引言

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)
}

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


在 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 secret
145149d64a1a3c4025e67665001a3167
DECRYPTED: This is a secret
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。