Как построить радомизированный режим CTR? - PullRequest
1 голос
/ 26 апреля 2020

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

#include <stdio.h>
#include <openssl/bn.h>
#include <openssl/aes.h>
#define mSize 4


void block_xor(unsigned char z[16], unsigned char x[16], unsigned char y[16])
{
    for (int i=0; i<16; i++)
        z[i] = x[i] ^ y[i];
}

int main(int argc, char* argv[]){
    BIGNUM *key = BN_new();
    unsigned char userkey[32];
    int size = 128;
    AES_KEY enckey,deckey;

    BN_rand(key, size, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
    BN_bn2bin(key, userkey);

    AES_set_encrypt_key(userkey, size, &enckey);
    //AES_set_decrypt_key(userkey, size, &deckey);

    unsigned char m[16*mSize+1] = "Practice randomized CTR mode";
    unsigned char enc[16*mSize+1] = {0};
    unsigned char dec[16*mSize+1] = {0};

    unsigned char counter[16];
    unsigned char blockkey[16]; 

    for(int i =0; i<mSize; i++){
        sprintf(counter, "%d", i);
        AES_encrypt(counter, blockkey, &enckey); // *** F(k,i) == F(enkey, counter) == blockkey 
        block_xor(&enc[16*i], &m[16*i], blockkey);
        //enc[i] = m[i] ^ blockkey
    }
    printf("enc: %s\n", enc);

    for(int i =0; i<mSize; i++){
        sprintf(counter, "%d", i);
        AES_encrypt(counter, blockkey, &enckey);
        block_xor(&dec[16*i], &enc[16*i], blockkey);
    }
    printf("dec: %s\n", dec);

    return 0;

}

1 Ответ

1 голос
/ 27 апреля 2020

Создайте одноразовый номер определенного размера, создав байтовый массив (массив char в C). Например, вы можете использовать один из 8 байтов (что, вероятно, является минимумом, потому что вы должны помнить о проблеме дня рождения). Затем вы заполняете этот массив случайными байтами.

Одноразовый номер затем копируется в старшие значащие биты счетчика. Счетчик обычно имеет значение с прямым порядком байтов, то есть слева (нижние индексы) справа. Остальные байты счетчика устанавливаются в ноль.

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


Теперь вы можете создать поток ключей, зашифровав счетчик и увеличив счетчик впоследствии. Открытый текст / зашифрованный текст затем XOR-редактируется с потоком ключей.

Кстати, эта функция либо отсутствует, либо неверна в вашем коде. Вы не видите этого, потому что одни и те же ошибки совершаются во время шифрования и дешифрования. Помните, что выполнение кода не означает безопасный код в криптографии.

...