54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package encryption
|
||
|
||
import "bytes"
|
||
|
||
type PaddingMode int
|
||
|
||
const (
|
||
NoPadding PaddingMode = iota
|
||
ZeroPadding
|
||
PKCS7Padding
|
||
)
|
||
|
||
// 对给定的数据进行填充,默认采用填充零的方式(ZeroPadding),也可以采用填充PKCS#7的方式(PKCS7Padding)或者不填充(NoPadding)。
|
||
func Padding(data []byte, blockSize int, padding ...PaddingMode) []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 ...PaddingMode) []byte {
|
||
paddingMethod := append(padding, ZeroPadding)[0]
|
||
switch paddingMethod {
|
||
case PKCS7Padding:
|
||
length := len(data)
|
||
unpadding := int(data[length-1])
|
||
if length-unpadding < 0 {
|
||
return make([]byte, 0)
|
||
}
|
||
return data[:(length - unpadding)]
|
||
case NoPadding:
|
||
return data
|
||
case ZeroPadding:
|
||
fallthrough
|
||
default:
|
||
return bytes.TrimRightFunc(data, func(r rune) bool {
|
||
return r == rune(0)
|
||
})
|
||
}
|
||
}
|