Двойное шифрование AES с генерацией случайного ключа - PullRequest
0 голосов
/ 23 мая 2018

Я использую 2 встроенных GSM-устройства.Там необходимо передавать данные между устройствами.Предположим, мне требуется отправить строку «кольцо» с одного устройства на другое.Это команда, которую нужно отправить несколько раз.Первое, что я делаю, это держу aes_key одинаковым на обоих устройствах.Затем зашифруйте input_data (то есть "boom") и получите enc_buffer.Отправьте этот enc_buffer через сокет на другое устройство.У другого устройства такой же aes_key.Используя это, я расшифровываю полученный буфер в dec_buffer.Я сомневаюсь, что зашифрованное сообщение enc_buffer будет одинаковым каждый раз, когда я отправляю зашифрованный текст для «boom».Если это так, то мне нужно следовать другому подходу.У меня есть 1-й уровень aes_key, который является постоянным.Затем мне нужно сгенерировать 2-й уровень aes_key.Зашифруйте 2-й уровень aes_key и отправьте его через сокет.В приемном устройстве расшифруйте его, используя aes_key 1-го уровня, чтобы получить aes_key 2-го уровня.Сохраните это.В 1-м устройстве снова зашифруйте строку «boom», используя aes_key 2-го уровня, отправьте ее через сокет.Во 2-м устройстве расшифруйте зашифрованное сообщение, используя aes_key 2-го уровня, чтобы получить текст «бум».Но другая проблема заключается в том, как создать aes_key 2-го уровня в 1-м устройстве.Есть ли какой-нибудь API генератора случайных ключей в Linux.Или я могу использовать API генератора случайных чисел.Мне нужен ключ длиной 10 символов.Для этого я вызываю генератор случайных чисел 10 раз, чтобы сгенерировать число от 0 до 26 и преобразовать его в символ.Затем соберите вместе, чтобы получить нужный ключ.Я использую пример кода AES, как показано ниже.Вставлено для ссылки на приведенный выше текст.

unsigned char aes_key[]= "asytfuhcilejnco";
unsigned char input_data[]= "Sandeep";
int data_size= strlen((char*)input_data);
int buffer_size = ((int)(data_size/AES_BLOCK_SIZE) + 1)*AES_BLOCK_SIZE;

AES_KEY enc_key,dec_key;
unsigned char iv[AES_BLOCK_SIZE];

int main()
{
unsigned char enc_buffer[buffer_size+1];
unsigned char dec_buffer[buffer_size+1];

    memset(iv,0x00,AES_BLOCK_SIZE);
    AES_set_encrypt_key(aes_key,sizeof(aes_key)*8,&enc_key);
    AES_cbc_encrypt(input_data,enc_buffer,sizeof(input_data),&enc_key,iv,AES_ENCRYPT);
    enc_buffer[buffer_size+1]='\0';

    memset(iv,0x00,AES_BLOCK_SIZE);
    AES_set_decrypt_key(aes_key,sizeof(aes_key)*8,&dec_key);
    AES_cbc_encrypt(enc_buffer,dec_buffer,sizeof(input_data),&dec_key,iv,AES_DECRYPT);
    dec_buffer[buffer_size+1]='\0';

    cout<<"input_data="<<input_data<<endl;
    cout<<"enc_buffer="<<enc_buffer<<endl;
    cout<<"dec_buffer="<<dec_buffer<<endl;
}

Итак, у меня есть 3 вопроса

  1. Зашифрованные данные всегда одинаковы для одинаковых input_data и aes_key?
  2. есть какой-нибудь API генератора случайных ключей?
  3. Какой системный вызов существует для случайных чисел в Linux c ++?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

enc_buffer[buffer_size+1]='\0'

Не делайте этого, это переполнение буфера.Максимальный индекс для обоих ваших буферов равен [buffer_size].

memset(iv,0x00,AES_BLOCK_SIZE);

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

0 голосов
/ 24 мая 2018

Зашифрованные данные всегда одинаковы для одинаковых input_data и aes_key?

Нет.Это то же самое для того же ключа , iv , & data .

Существует ли какой-либо API генератора случайных ключей?

Да, например, у OpenSSL есть такой.

Какой системный вызов существует для случайных чисел в Linux c ++?

"Хорошим" генератором случайных чисел является / dev / urandom.Возможно, лучше, если доступно, это / dev / hwrng, однако это не так, как лучше./ dev / random аналогичен, возможно, лучше / dev / urandom, но блокируется, когда достаточная энтропия недоступна.

Во всех случаях вы читаете эти устройства так же, как вы читаете данные из файла.

...