yjp 1 anno fa
parent
commit
ea45d9ebfe
2 ha cambiato i file con 88 aggiunte e 0 eliminazioni
  1. 60 0
      encoding/encoding.go
  2. 28 0
      encoding/encoding_test.go

+ 60 - 0
encoding/encoding.go

@@ -0,0 +1,60 @@
+package utils
+
+import (
+	"bytes"
+	"crypto/aes"
+	"crypto/cipher"
+	"encoding/base64"
+)
+
+func AESEncrypt(originData string, key string) (string, error) {
+	keyBytes := []byte(key)
+
+	block, err := aes.NewCipher(keyBytes)
+	if err != nil {
+		return "", err
+	}
+
+	originDataBytes := []byte(originData)
+	blockSize := block.BlockSize()
+	originDataBytes = pkcs7Padding(originDataBytes, blockSize)
+	blockMode := cipher.NewCBCEncrypter(block, keyBytes[:blockSize])
+	encrypted := make([]byte, len(originDataBytes))
+	blockMode.CryptBlocks(encrypted, originDataBytes)
+
+	return base64.StdEncoding.EncodeToString(encrypted), nil
+}
+
+func AESDecrypt(encrypted string, key string) (string, error) {
+	keyBytes := []byte(key)
+
+	block, err := aes.NewCipher(keyBytes)
+	if err != nil {
+		return "", err
+	}
+
+	decoded, err := base64.StdEncoding.DecodeString(encrypted)
+	if err != nil {
+		return "", err
+	}
+
+	blockSize := block.BlockSize()
+	blockMode := cipher.NewCBCDecrypter(block, keyBytes[:blockSize])
+	originData := make([]byte, len(decoded))
+	blockMode.CryptBlocks(originData, decoded)
+	originData = pkcs7UnPadding(originData)
+
+	return string(originData), nil
+}
+
+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(originData []byte) []byte {
+	length := len(originData)
+	unPadding := int(originData[length-1])
+	return originData[:(length - unPadding)]
+}

+ 28 - 0
encoding/encoding_test.go

@@ -0,0 +1,28 @@
+package utils
+
+import (
+	"testing"
+)
+
+func TestAES(t *testing.T) {
+	origin := "foo"
+	key := "@MKU^AAOPH%%$#VJ<%G&j*o#$XZSWQ@L"
+
+	encrypted, err := AESEncrypt(origin, key)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if encrypted == "" {
+		t.Fatal("加密没有密文")
+	}
+
+	decrypted, err := AESDecrypt(encrypted, key)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if decrypted != origin {
+		t.Fatal("解密内容和加密内容不一致")
+	}
+}