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