前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go AES加解密

Go AES加解密

作者头像
恋喵大鲤鱼
发布2019-05-05 11:26:30
11.7K0
发布2019-05-05 11:26:30
举报
文章被收录于专栏:C/C++基础C/C++基础

版权声明:感谢您对博文的关注!

https://cloud.tencent.com/developer/article/1420428

利用Go提供的AES加解密与Base64编解码包,我们可以轻松地实现AES的加解密。实现之前,首先了解一下AES的一些常识点。

(1)AES有5种加密模式,分别是:

(a)电码本模式(Electronic Codebook Book,ECB);

(b)密码分组链接模式(Cipher Block Chaining ,CBC),如果明文长度不是分组长度16字节的整数倍需要进行填充;

(c)计算器模式(Counter,CTR);

(d)密码反馈模式(Cipher FeedBack,CFB);

(e)输出反馈模式(Output FeedBack,OFB)。

(2)AES是对称分组加密算法,每组长度为128bits,即16字节。

(3)AES秘钥的长度只能是16、24或32字节,分别对应三种AES,即AES-128, AES-192和AES-256,三者的区别是加密的轮数不同;

下面以CBC模式为例,实现AES加解密。

代码语言:javascript
复制
package aeswrap

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

//@brief:填充明文
func PKCS5Padding(plaintext []byte, blockSize int) []byte{
    padding := blockSize-len(plaintext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)},padding)
    return append(plaintext,padtext...)
}

//@brief:去除填充数据
func PKCS5UnPadding(origData []byte) []byte{
    length := len(origData)
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

//@brief:AES加密
func AesEncrypt(origData, key []byte) ([]byte, error){
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

	//AES分组长度为128位,所以blockSize=16,单位字节
    blockSize := block.BlockSize()
    origData = PKCS5Padding(origData,blockSize)					
    blockMode := cipher.NewCBCEncrypter(block,key[:blockSize])	//初始向量的长度必须等于块block的长度16字节
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted,origData)
    return crypted, nil
}

//@brief:AES解密
func AesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

	//AES分组长度为128位,所以blockSize=16,单位字节
    blockSize := block.BlockSize()
    blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])	//初始向量的长度必须等于块block的长度16字节
    origData := make([]byte, len(crypted))
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

func main(){
	//key的长度必须是16、24或者32字节,分别用于选择AES-128, AES-192, or AES-256
    var aeskey = []byte("12345678abcdefgh")
    pass := []byte("vdncloud123456")
    xpass, err := AesEncrypt(pass,aeskey)
    if err != nil {
        fmt.Println(err)
        return
    }

    pass64 := base64.StdEncoding.EncodeToString(xpass)
    fmt.Printf("加密后:%v\n",pass64)

    bytesPass, err := base64.StdEncoding.DecodeString(pass64)
    if err != nil {
        fmt.Println(err)
        return
    }

    tpass, err := AesDecrypt(bytesPass, aeskey)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("解密后:%s\n", tpass)
}

编译运行输出:

代码语言:javascript
复制
加密后:Z9Mz4s6LDwYpIam4z+fqxw==
解密后:vdncloud123456

如果想了解AES实现原理,可参考AES加密算法的详细介绍与实现


参考文献

1(https://golang.google.cn/)

2(https://blog.csdn.net/qq_28205153/article/details/55798628#commentBox)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档