Режим AES256 OFB получает поток ключей в C / C ++ - PullRequest
2 голосов
/ 11 марта 2020

Я работаю над проектом, в котором используется режим AES256 OFB. Также я использую библиотеку из библиотеки AES от Брайана Гладмана . Мой вопрос: как я могу генерировать потоки ключей? Насколько я понимаю, у меня есть начальный вектор, с которого можно начать. Мы зашифровываем IV для получения потока ключей, затем поток ключей снова шифруется для генерации последующего потока ключей и так далее. У меня есть следующий код, но я не могу получить правильный поток ключей.

unsigned char szKey[32] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x45, 0x67, 0x89, 0xA8, 0xCD, 0xEF, 0x01, 0x23, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45 };
unsigned char szIV[16] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x6f, 0xe2, 0x80, 0x2a, 0xa4, 0x03, 0x82, 0x8b };
unsigned char szKeystream1[16];
unsigned char szKeystream2[16];

aes_init();

aes_encrypt_ctx ctx[1];
aes_encrypt_key(szKey, 32, ctx);
aes_encrypt(szIV, szKeystream1, ctx); // generate the first keystream

aes_encrypt(szKeystream1, szKeystream2, ctx); // to generate the second keystream

Редактировать: оказывается, в моем ключе есть опечатка ... 0xA8 должно быть 0xAB ... извините, и я ценю вас, ребята, посмотрите на это

1 Ответ

2 голосов
/ 11 марта 2020

OFB работает следующим образом:

Сначала вы генерируете IV байтов размера блока.

Затем вы шифруете этот IV с помощью ключа AES.

Результат эта операция шифрования используется для шифрования первого блока открытого текста с помощью XOR'а. Поскольку XOR является симметричной c операцией, та же процедура применяется для дешифрования первого блока зашифрованного текста в открытый текст.

Результат этой операции также шифруется снова с тем же ключом AES для шифрование следующего блока открытого текста (или дешифрование следующего блока зашифрованного текста). Этот процесс повторяется до тех пор, пока все данные не будут зашифрованы (дешифрованы).

Так что да, в вашем коде здесь

aes_encrypt(szIV, szKeystream1, ctx); // generate the first keystream
aes_encrypt(szKeystream1, szKeystream2, ctx); // to generate the second keystream

вы генерируете два блока, подходящих для AES-ofb. Чего еще не хватает, так это операции XOR с блоком открытого текста для шифрования (или блоком шифрованного текста для дешифрования). Вы можете повторить процедуру для больших блоков данных.

char data[DATALEN];
aes_encrypt(szIV, szKeystream1, ctx); // generate the first xor block
for (int i = 0; i < DATALEN; i += AES_BLOCK_LENGTH) {
    for (int j = 0; j < AES_BLOCK_LENGTH; j++) {
        data[i+j] ^= szKeystream1[j];
    }
    aes_encrypt(szKeystream1, szKeystream2, ctx); // generate next block
    memcpy(szKeystream1, szKeystream2, sizeof(szKeystream1);
}
...