使用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))
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章