From 5216a57797413496cf01b85c1e621ce46ef21411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Wed, 12 Jul 2023 22:55:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(encrypt):=E5=A2=9E=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=95=B0=E6=8D=AE=E5=A1=AB=E5=85=85=E5=A4=84?= =?UTF-8?q?=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- encryption/encryption.go | 2 ++ encryption/padding.go | 48 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 encryption/encryption.go create mode 100644 encryption/padding.go diff --git a/encryption/encryption.go b/encryption/encryption.go new file mode 100644 index 0000000..b2435c0 --- /dev/null +++ b/encryption/encryption.go @@ -0,0 +1,2 @@ +// 提供用于支持加解密算法的基础功能函数。 +package encryption diff --git a/encryption/padding.go b/encryption/padding.go new file mode 100644 index 0000000..ba89c72 --- /dev/null +++ b/encryption/padding.go @@ -0,0 +1,48 @@ +package encryption + +import "bytes" + +const ( + NoPadding = iota + ZeroPadding + PKCS7Padding +) + +// 对给定的数据进行填充,默认采用填充零的方式(ZeroPadding),也可以采用填充PKCS#7的方式(PKCS7Padding)或者不填充(NoPadding)。 +func Padding(data []byte, blockSize int, padding ...int) []byte { + paddingMethod := append(padding, ZeroPadding)[0] + n := blockSize - len(data)%blockSize + switch paddingMethod { + case PKCS7Padding: + pad := bytes.Repeat([]byte{byte(n)}, n) + return append(data, pad...) + case NoPadding: + return data + case ZeroPadding: + fallthrough + default: + if n == 0 { + return data + } + return append(data, bytes.Repeat([]byte{0}, n)...) + } +} + +// 对给定的数据进行去填充,默认采用去填充零的方式(对应ZeroPadding),也可以采用去填充PKCS#7的方式(对应PKCS7Padding)或者不填充(对应NoPadding)。 +func Unpadding(data []byte, padding ...int) []byte { + paddingMethod := append(padding, ZeroPadding)[0] + switch paddingMethod { + case PKCS7Padding: + length := len(data) + unpadding := int(data[length-1]) + return data[:(length - unpadding)] + case NoPadding: + return data + case ZeroPadding: + fallthrough + default: + return bytes.TrimRightFunc(data, func(r rune) bool { + return r == rune(0) + }) + } +}