From 5cee2dd50e49bf45802baec0250e5a514fe1dd40 Mon Sep 17 00:00:00 2001 From: dushixiang Date: Tue, 13 Apr 2021 23:56:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0AES=20CBC=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/install-naive.md | 2 +- server/utils/util_test.go | 18 +++++++++++++++++ server/utils/utils.go | 42 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/docs/install-naive.md b/docs/install-naive.md index 146f7b7..9dfc927 100644 --- a/docs/install-naive.md +++ b/docs/install-naive.md @@ -180,5 +180,5 @@ WantedBy=multi-user.target systemctl daemon-reload systemctl enable next-terminal systemctl start next-terminal -systemctl staus next-terminal +systemctl status next-terminal ``` \ No newline at end of file diff --git a/server/utils/util_test.go b/server/utils/util_test.go index 2f9d0f3..70c6330 100644 --- a/server/utils/util_test.go +++ b/server/utils/util_test.go @@ -1,6 +1,7 @@ package utils_test import ( + "encoding/base64" "net" "testing" @@ -33,3 +34,20 @@ func TestTcping(t *testing.T) { _ = conn.Close() }() } + +func TestAesEncryptCBC(t *testing.T) { + origData := []byte("Hello Next Terminal") // 待加密的数据 + key := []byte("qwertyuiopasdfgh") // 加密的密钥 + encryptedCBC, err := utils.AesEncryptCBC(origData, key) + assert.NoError(t, err) + assert.Equal(t, "s2xvMRPfZjmttpt+x0MzG9dsWcf1X+h9nt7waLvXpNM=", base64.StdEncoding.EncodeToString(encryptedCBC)) +} + +func TestAesDecryptCBC(t *testing.T) { + origData, err := base64.StdEncoding.DecodeString("s2xvMRPfZjmttpt+x0MzG9dsWcf1X+h9nt7waLvXpNM=") // 待解密的数据 + assert.NoError(t, err) + key := []byte("qwertyuiopasdfgh") // 解密的密钥 + decryptCBC, err := utils.AesDecryptCBC(origData, key) + assert.NoError(t, err) + assert.Equal(t, "Hello Next Terminal", string(decryptCBC)) +} diff --git a/server/utils/utils.go b/server/utils/utils.go index d586471..0f94e50 100644 --- a/server/utils/utils.go +++ b/server/utils/utils.go @@ -2,6 +2,8 @@ package utils import ( "bytes" + "crypto/aes" + "crypto/cipher" "crypto/md5" "database/sql/driver" "encoding/base64" @@ -224,3 +226,43 @@ func Check(f func() error) { logrus.Error("Received error:", err) } } + +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 := int(origData[length-1]) + return origData[:(length - unPadding)] +} + +func AesEncryptCBC(origData, key []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + blockSize := block.BlockSize() + origData = PKCS5Padding(origData, blockSize) + blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) + encrypted := make([]byte, len(origData)) + blockMode.CryptBlocks(encrypted, origData) + return encrypted, nil +} + +func AesDecryptCBC(encrypted, 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(encrypted)) + blockMode.CryptBlocks(origData, encrypted) + origData = PKCS5UnPadding(origData) + return origData, nil +}