Files
fanqie-go/internal/algos/pkcs7.go
T
chenxin 6981148727 🔧 chore: 初始化番茄小说 API 项目结构
新增项目基础框架,包含核心 API 实现、算法模块、HTTP 处理器等完整功能模块
2026-08-28 15:22:22 +08:00

79 lines
1.6 KiB
Go

package algos
// PKCS7DataLength 获取PKCS7填充数据的实际长度
func PKCS7DataLength(buffer []byte, bufferSize, modulus int) int {
if bufferSize%modulus != 0 || bufferSize < modulus {
return 0
}
paddingValue := buffer[bufferSize-1]
if paddingValue < 1 || int(paddingValue) > modulus {
return 0
}
if bufferSize < int(paddingValue)+1 {
return 0
}
count := 1
bufferSize--
for i := count; i < int(paddingValue); i++ {
bufferSize--
if buffer[bufferSize] != paddingValue {
return 0
}
}
return bufferSize
}
// PKCS7PadBuffer 对缓冲区进行PKCS7填充
func PKCS7PadBuffer(buffer []byte, dataLength, bufferSize, modulus int) int {
padByte := modulus - (dataLength % modulus)
if dataLength+padByte > bufferSize {
return -padByte
}
for i := 0; i < padByte; i++ {
buffer[dataLength+i] = byte(padByte)
}
return padByte
}
// PaddingSize 计算填充后的大小
func PaddingSize(size int) int {
mod := size % 16
if mod > 0 {
return size + (16 - mod)
}
return size
}
// RemovePKCS7Padding 移除PKCS7填充
func RemovePKCS7Padding(data []byte) []byte {
length := len(data)
if length == 0 {
return data
}
paddingLen := int(data[length-1])
if paddingLen > length || paddingLen > 16 {
return data
}
return data[:length-paddingLen]
}
// AddPKCS7Padding 添加PKCS7填充
func AddPKCS7Padding(data []byte, blockSize int) []byte {
padding := blockSize - len(data)%blockSize
padText := make([]byte, padding)
for i := range padText {
padText[i] = byte(padding)
}
return append(data, padText...)
}