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) + }) + } +}