feat(encrypt):增加通用的数据填充处理。
This commit is contained in:
parent
4229c1a7a5
commit
5216a57797
2
encryption/encryption.go
Normal file
2
encryption/encryption.go
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
// 提供用于支持加解密算法的基础功能函数。
|
||||||
|
package encryption
|
48
encryption/padding.go
Normal file
48
encryption/padding.go
Normal file
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user