我试图加密一些数据,但它几乎没有正确的cipher.BlockSize
。
是否有"内置"添加填充的方法或我应该使用函数手动添加它?
这是我现在的解决方案:
// encrypt() encrypts the message, but sometimes the
// message isn't the proper length, so we add padding.
func encrypt(msg []byte, key []byte) []byte {
cipher, err := aes.NewCipher(key)
if err != nil {
log.Fatal(err)
}
if len(msg) < cipher.BlockSize() {
var endLength = cipher.BlockSize() - len(msg)
ending := make([]byte, endLength, endLength)
msg = append(msg[:], ending[:]...)
cipher.Encrypt(msg, msg)
} else {
var endLength = len(msg) % cipher.BlockSize()
ending := make([]byte, endLength, endLength)
msg = append(msg[:], ending[:]...)
cipher.Encrypt(msg, msg)
}
return msg
}
答案 0 :(得分:2)
查看Package cipher,您可能需要自己添加填充,请参阅PKCS#7 padding。
基本上添加所需的填充字节,每个字节的值是添加的填充字节数。
请注意,您需要一致地添加填充,这意味着如果要加密的数据是块大小的精确倍数,则必须添加整个填充块,因为如果填充具有填充,则无法从数据中获知是否添加,尝试超越智能是一个常见的错误。考虑最后一个字节是否为0x00,是填充还是数据?
答案 1 :(得分:1)
这是我的解决方案
// padOrTrim returns (size) bytes from input (bb)
// Short bb gets zeros prefixed, Long bb gets left/MSB bits trimmed
func padOrTrim(bb []byte, size int) []byte {
l := len(bb)
if l == size {
return bb
}
if l > size {
return bb[l-size:]
}
tmp := make([]byte, size)
copy(tmp[size-l:], bb)
return tmp
}