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