Правильный способ добавить дополнение к байтовому срезу в golang?
Я пытаюсь зашифровать некоторые данные, но это вряд ли когда-нибудь 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
}
2 ответа
Глядя на шифр пакета, кажется, что вам, возможно, придется добавить заполнение самостоятельно, см. Заполнение PKCS#7.
По существу добавьте требуемые байты заполнения со значением каждого байта к числу добавленных байтов заполнения.
Обратите внимание, что вам нужно последовательно добавлять заполнение, и это означает, что если данные, которые должны быть зашифрованы, являются точным кратным размеру блока, то должен быть добавлен весь блок заполнения, так как по данным невозможно узнать, было ли добавлено заполнение или нет, это распространенная ошибка, чтобы попытаться перехитрить это. Подумайте, является ли последний байт 0x00, это заполнение или данные?
Вот мое решение
// 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
}