其他分享
首页 > 其他分享> > 使用GO语言实现对称加密,DES、3DES、AES

使用GO语言实现对称加密,DES、3DES、AES

作者:互联网

使用GO语言实现对称加密,DES、3DES、AES

package main

import (
	"bytes"
	"crypto/aes"
	"crypto/cipher"
	"crypto/des"
)

// 填充最后一个分组的函数
// src - 原始数据
// blockSize - 每个分组的数据长度
func padding(src []byte, blockSize int) []byte {
	// 1、求出最后一个分组要填充多少个字节
	padding := blockSize - len(src)%blockSize
	// 2、创建新的切片,切片的字节数为padding,并初始化,每个字节的值为padding
	padText := bytes.Repeat([]byte{byte(padding)}, padding)
	// 3、将创建出的新切片和原始数据进行链接
	newText := append(src, padText...)
	// 4、返回新的字符串
	return newText
}

//删除末尾填充的字节
func unPadding(src []byte) []byte {
	//1、 求出切片的长度
	len := len(src)
	// 2、取出最后一个字符,得到整型值
	number := int(src[len-1])
	// 3、将切片末尾的number个字节删除
	netText := src[:len-number]
	return netText
}

//使用des进行对称加密
func encryptDES(src []byte, private []byte) []byte {
	//1、创建并返回一个使用DES算法的cipher.Block接口
	block, _ := des.NewCipher(private)
	//2、对最后一个明文分组进行数据填充
	src = padding(src, block.BlockSize())
	//3、创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
	iv := []byte("12345678")
	blockMode := cipher.NewCBCEncrypter(block, iv)
	//4、加密连续的数据块
	dst := make([]byte, len(src))
	blockMode.CryptBlocks(dst, src)
	return dst
}

//使用des进行解密
func decryptDES(src, private []byte) []byte {
	block, err := des.NewCipher(private)
	if err != nil {
		print(err)
	}
	//2、创建一个密码分组位链接模式的,底层使用DES解密的BlockMode接口
	iv := []byte("12345678")
	blockMode := cipher.NewCBCDecrypter(block, iv)
	//3、数据库解密
	blockMode.CryptBlocks(src, src)
	//4、去掉最后一组的填充数据
	newText := unPadding(src)
	return newText
}

//使用des进行对称加密
func encrypt3DES(src []byte, private []byte) []byte {
	//1、创建并返回一个使用DES算法的cipher.Block接口
	block, _ := des.NewTripleDESCipher(private)
	//2、对最后一个明文分组进行数据填充
	src = padding(src, block.BlockSize())
	//3、创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
	blockMode := cipher.NewCBCEncrypter(block, private[:block.BlockSize()])
	//4、加密连续的数据块
	dst := make([]byte, len(src))
	blockMode.CryptBlocks(dst, src)
	return dst
}

//使用des进行解密
func decrypt3DES(src, private []byte) []byte {
	block, err := des.NewTripleDESCipher(private)
	if err != nil {
		print(err)
	}
	//2、创建一个密码分组位链接模式的,底层使用DES解密的BlockMode接口
	blockMode := cipher.NewCBCDecrypter(block, private[:block.BlockSize()])
	//3、数据库解密
	blockMode.CryptBlocks(src, src)
	//4、去掉最后一组的填充数据
	newText := unPadding(src)
	return newText
}

//使用AES加密
func encryptAES(src, private []byte) []byte {
	//1、创建并返回一个使用AES算法的cipher.Block接口
	block, err := aes.NewCipher(private)
	if err != nil {
		panic(err)
	}
	//2、数据填充
	src = padding(src, block.BlockSize())
	//3、创建一个密码分组位链接模式的,底层使用AES解密的BlockMode接口
	blockMode := cipher.NewCBCEncrypter(block, private)
	//4、数据加密
	blockMode.CryptBlocks(src, src)
	return src
}

//使用AES加密
func decryptAES(src, private []byte) []byte {
	//1、创建并返回一个使用AES算法的cipher.Block接口
	block, err := aes.NewCipher(private)
	if err != nil {
		panic(err)
	}
	//2、创建一个密码分组位链接模式的,底层使用AES解密的BlockMode接口
	blockMode := cipher.NewCBCDecrypter(block, private)
	//3、数据解密
	blockMode.CryptBlocks(src, src)
	//4、去掉填充数据
	src = unPadding(src)
	return src
}

测试程序

package main

import "fmt"

func main() {
	fmt.Println("go 加解密DEMO ")
	desTest()
	tdesTest()
	aesTest()
}

//测试DES加解密
func desTest() {
	fmt.Println("======== des 加解密 =========")
	src := []byte("今天天气好晴朗")
	key := []byte("12345678")
	des := encryptDES(src, key)
	des = decryptDES(des, key)
	fmt.Println("解密后明文:", string(des))
}

//测试3DES加解密
func tdesTest() {
	fmt.Println("======== 3des 加解密 =========")
	src := []byte("今天天气好晴朗,处处好风光")
	key := []byte("123456788765432112345678")
	des := encrypt3DES(src, key)
	des = decrypt3DES(des, key)
	fmt.Println("解密后明文:", string(des))
}

//测试AES加解密
func aesTest() {
	fmt.Println("======== aes 加解密 =========")
	src := []byte("今天天气好晴朗,处处好风光")
	key := []byte("1234567887654321")
	des := encryptAES(src, key)
	des = decryptAES(des, key)
	fmt.Println("解密后明文:", string(des))
}

标签:3DES,AES,des,src,DES,private,blockMode,byte,block
来源: https://blog.csdn.net/July_whj/article/details/100171895