博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go AES加密解密
阅读量:4069 次
发布时间:2019-05-25

本文共 3419 字,大约阅读时间需要 11 分钟。

之前写了一个python监控系统,里面用到了使用了AES对密码进行加密,那golang去如何实现AES的加密解密呢,

说明:

1.这里就以CBC模式来说明,使用了iv(偏远向量),所以在对同一个明文使用同一个key 加密的时候,发现每次加密出来结果都不同,就不要大惊小怪了

2.这里面包含了2种补全方式:PKCS5Padding/PKCS7Padding,代码里都写出了,至于选择哪一个,根据自己的需要去决定

当然了,我这里使用了PKCS5Padding,因为之前的写的python AES加密解密使用的就是PKCS5Padding,为了能够python和go互通,这里就统一使用同一种方式。

3.这里还有一个注意的地方就是密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)

当然我使用的python 写的脚本就没有对key长度要求,至于go如何去实现不限制key的长度这里先不说,等后面实现了再贴上。

package mainimport (	"bytes"	"crypto/aes"	"crypto/cipher"	"crypto/rand"	"encoding/base64"	"fmt"	"io")func main() {	var key = []byte("ABCDEFGHIJKLMNOp")	//每次得到的结果都不同,但是都可以解密	fmt.Println("oracle=", []byte("oracle"))	msg, ok := AesCBCEncrypt([]byte("oracle"),key)	if ok !=nil {		fmt.Println("encrypt is failed.")	}	fmt.Println("msg=", msg)		text, ok := AesCBCDncrypt(msg, key)	if ok !=nil {		fmt.Println("decrypt is failed.")	}	fmt.Println("text=", text)	fmt.Println("text=", string(text))}/*CBC加密 按照golang标准库的例子代码不过里面没有填充的部分,所以补上*///使用PKCS5进行填充func PKCS5Padding(ciphertext []byte, blockSize int) []byte {	padding := blockSize - len(ciphertext) % blockSize	padtext := bytes.Repeat([]byte{byte(padding)}, padding)	return append(ciphertext, padtext...)}func PKCS5UnPadding(origData []byte) []byte {	length := len(origData)	unpadding := int(origData[length - 1])	return origData[:(length - unpadding)]}//使用PKCS7进行填充func PKCS7Padding(ciphertext []byte, blockSize int) []byte {	padding := blockSize - len(ciphertext) % blockSize	padtext := bytes.Repeat([]byte{byte(padding)}, padding)	return append(ciphertext, padtext...)}func PKCS7UnPadding(origData []byte) []byte {	length := len(origData)	unpadding := int(origData[length-1])	return origData[:(length - unpadding)]}//aes加密,填充秘钥key的16位,24,32分别对应AES-128, AES-192, or AES-256.func AesCBCEncrypt(rawData,key []byte) ([]byte, error) {	block, err := aes.NewCipher(key)	if err != nil {		panic(err)	}	//填充原文	blockSize := block.BlockSize()		rawData = PKCS5Padding(rawData, blockSize)			//初始向量IV必须是唯一,但不需要保密	cipherText := make([]byte,blockSize+len(rawData))		//block大小 16	iv := cipherText[:blockSize]		if _, err := io.ReadFull(rand.Reader,iv); err != nil {		panic(err)	}		//block大小和初始向量大小一定要一致	mode := cipher.NewCBCEncrypter(block,iv)	mode.CryptBlocks(cipherText[blockSize:],rawData)		return cipherText, nil}func AesCBCDncrypt(encryptData, key []byte) ([]byte,error) {	block, err := aes.NewCipher(key)	if err != nil {		panic(err)	}	blockSize := block.BlockSize()	if len(encryptData) < blockSize {		panic("ciphertext too short")	}	iv := encryptData[:blockSize]			encryptData = encryptData[blockSize:]	fmt.Println("encryptData=", encryptData)	fmt.Println(len(encryptData)%blockSize)	// CBC mode always works in whole blocks.	if len(encryptData)%blockSize != 0 {		panic("ciphertext is not a multiple of the block size")	}	mode := cipher.NewCBCDecrypter(block, iv)	// CryptBlocks can work in-place if the two arguments are the same.	mode.CryptBlocks(encryptData, encryptData)	//解填充	encryptData = PKCS5UnPadding(encryptData)	return encryptData,nil}func Encrypt(rawData,key []byte) (string,error) {	data, err:= AesCBCEncrypt(rawData,key)	if err != nil {		return "",err	}	return base64.StdEncoding.EncodeToString(data),nil}func Dncrypt(rawData string,key []byte) (string,error) {	data,err := base64.StdEncoding.DecodeString(rawData)	if err != nil {		return "",err	}	dnData,err := AesCBCDncrypt(data,key)	if err != nil {		return "",err	}	return string(dnData),nil //}

 

转载地址:http://szhji.baihongyu.com/

你可能感兴趣的文章
platform_device与platform_driver
查看>>
platform_driver平台驱动注册和注销过程(下)
查看>>
.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
查看>>
c# 如何调用win8自带的屏幕键盘(非osk.exe)
查看>>
build/envsetup.sh 简介
查看>>
C++后继有人——D语言
查看>>
Android framework中修改或者添加资源无变化或编译不通过问题详解
查看>>
linux怎么切换到root里面?
查看>>
linux串口操作及设置详解
查看>>
安装alien,DEB与RPM互换
查看>>
linux系统下怎么安装.deb文件?
查看>>
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
linux环境下C语言中sleep的问题
查看>>
ubuntu 12.04 安装 GMA3650驱动
查看>>
新版本的linux如何生成xorg.conf
查看>>
xorg.conf的编写
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>
No devices detected. Fatal server error: no screens found
查看>>