Падение байта [] на кратное 16 байт для шифрования AES - PullRequest
3 голосов
/ 17 июля 2009

В настоящее время у меня есть функция [C #], которая принимает байт [] и выравнивание, чтобы установить его, но во время шифрования ошибка выдается каждый раз через некоторое время.

    private byte[] AlignByteArray(byte[] content, int alignto)
    {
        long thelength = content.Length - 1;
        long remainder = 1;

        while (remainder != 0)
        {
            thelength += 1;
            remainder = thelength % alignto;
        }
        Array.Resize(ref content, (int)thelength);
        return content;
    }

Кто-нибудь видит какие-либо проблемы с функцией? Я получаю сообщения об ошибках, что размер содержимого недопустим во время шифрования AES, что свидетельствует о неправильном заполнении.

Ответы [ 2 ]

10 голосов
/ 17 июля 2009

Вот простое решение:

private static void PadToMultipleOf(ref byte[] src, int pad)
{
    int len = (src.Length + pad - 1) / pad * pad;
    Array.Resize(ref src, len);
}
2 голосов
/ 17 июля 2009

Вы уверены, что это 0x16, а не 16? (Я думал, что это было 16, поэтому я предполагаю, что).

Редактировать: Любой приличный компилятор должен превратить (x / 16) в (x >> 4).

int length = 16 * ((content.Length + 15) / 16);
Array.Resize(ref content, length);

Редактировать 2: Для общего назначения:

int length = alignment * ((content.Length + alignment - 1) / alignment);
Array.Resize(ref content, length);
...