由于第一家公司的原因,所以在无论前端和后台开发过程中我对数据安全看的特别看重,
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/des"
"encoding/base64"
"fmt"
)
func main() {
testAes()
testDes()
}
func testDes() {
origData := []byte("Introduction of Hubei Polytechnic University")
key := []byte("@23&5670")
encrypt, err := DesEncrypt(origData, key)
if err != nil {
fmt.Println(err)
}
str := string(encrypt)
fmt.Println(str)
decrypt, err := DesDecrypt(encrypt, key)
fmt.Println("decrypt:", string(decrypt))
}
func testAes() {
// AES-128。key长度:16, 24, 32 bytes 对应 AES-128, AES-192, AES-256
key := []byte("s@e023f_9fd&fwfl")
result, err := AesEncrypt([]byte("polaris@studygolang"), key)
if err != nil {
panic(err)
}
resultStr := base64.StdEncoding.EncodeToString(result)
fmt.Println(resultStr)
data, err := base64.StdEncoding.DecodeString(resultStr)
origData, err := AesDecrypt(data, key)
if err != nil {
panic(err)
}
fmt.Println(string(origData))
}
func AesEncrypt(origData, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
origData = PKCS5Padding(origData, blockSize)
// origData = ZeroPadding(origData, block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
crypted := make([]byte, len(origData))
// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
// crypted := origData
blockMode.CryptBlocks(crypted, origData)
return crypted, nil
}
func AesDecrypt(crypted, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
origData := make([]byte, len(crypted))
// origData := crypted
blockMode.CryptBlocks(origData, crypted)
origData = PKCS5UnPadding(origData)
// origData = ZeroUnPadding(origData)
return origData, nil
}
func DesEncrypt(origData, key []byte) ([]byte, error) {
block, err := des.NewCipher(key)
if err != nil {
return nil, err
} else {
origData = PKCS5Padding(origData, block.BlockSize())
}
origData = PKCS5Padding(origData, block.BlockSize())
blockModel := cipher.NewCBCEncrypter(block, key)
crypted := make([]byte, len(origData))
blockModel.CryptBlocks(crypted, origData)
return crypted, nil
}
func DesDecrypt(crypted, key []byte) ([]byte, error) {
block, err := des.NewCipher(key)
if err != nil {
return nil, err
}
blockModel := cipher.NewCBCDecrypter(block, key)
origData := make([]byte, len(crypted))
blockModel.CryptBlocks(origData, crypted)
//origData = PKCUnPaddint(origData)
origData = ZeroUnPadding(origData)
return origData, nil
}
func ZeroPadding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{0}, padding)
return append(ciphertext, padtext...)
}
func ZeroUnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
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 次
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
参考文档
AES和DES
网友评论