Как обнаружить сбой дешифрования с помощью TurboPower Lockbox 3.5

Как обнаружить ошибку расшифровки? У меня есть следующий тестовый код:

procedure TForm1.Button1Click(Sender: TObject);
var 
 plainms, cipherms: TMemoryStream;
 tempstr: string;

begin
  plainms := TMemoryStream.Create;
  cipherms := TMemoryStream.Create;
  try
    cipherms.LoadFromFile('rwcx.ini');
    Codec1.Password := '122rkdkdk';  
    try
     Codec1.DecryptStream(plainms, cipherms);
    except on E: Exception do
      showmessage(e.Message);
    end;
    plainms.Position := 0;
    SetLength(tempstr, plainms.Size * 2);
    BinToHex(plainms.Memory, PChar(tempstr), plainms.Size);
    showmessage(tempstr);
  finally
    plainms.Free;
    cipherms.Free;
  end;
end;

Файл «rwcx.ini» — это обычный текстовый файл, который не содержит зашифрованные данные. Я использую AES 256 с CBC и версию 3.5 Lockbox, установленную с «GetIt». Я ожидал, что поток памяти plainms будет пустым или возникнет исключение, так как расшифровка гарантированно завершится ошибкой. Вместо этого я получаю мусор в равнинах и без исключения.

Как определить, что расшифровка не удалась? Я должен уметь обнаруживать неверные пароли или поврежденные входные данные. Что мне не хватает?


person Mike    schedule 12.02.2016    source источник


Ответы (1)


Шифрование — это просто преобразование, само по себе оно не имеет понятия о правильном расшифровывании.

Один из методов состоит в том, чтобы создать HMAC из зашифрованных данных и добавить его к зашифрованным данным, а при расшифровке HMAC — зашифрованные данные и сравнить HMAC. Будьте осторожны при использовании функции сравнения HMAC, которая занимает одинаковое количество времени для совпадающих и несовпадающих значений.

person zaph    schedule 12.02.2016
comment
Я надеялся, что это не так. Где-то на веб-страницах библиотеки, которые я читал, упрощается обнаружение сбоев дешифрования или что-то в этом роде. Я думал, что это означает, что HMAC был встроен. Я также прочитал ответ автора на его форумах относительно RSA, в котором говорилось, что дешифрование должно быть заключено в блок try/except для обнаружения неправильного ключа. Я думаю, это работает только для RSA, а не для AES. Я реализую свой собственный HMAC, как вы предлагаете. Спасибо за быстрый ответ. - person Mike; 13.02.2016
comment
Примечание. Иногда разработчики думают, что проверка корректной четности — это решение, но это не совсем правильно, и возврат ошибки заполнения в cient позволяет злоумышленнику получить зашифрованные данные без ключа, см. атаку оракула заполнения. Кроме того, AED GCM имеет встроенную аутентификацию, но поддержка все еще невелика. - person zaph; 13.02.2016
comment
Взгляните на формат RNCryptor, это хорошая схема. - person zaph; 13.02.2016
comment
Очень хорошее чтение. Я бы и не подумал поместить какие-либо данные в чистом виде, как предполагает формат RNCryptor. Я SHA хешировал открытый текст, а затем зашифровал 32-байтовый хэш + открытый текст. Поскольку модуль расшифровки расшифровывает независимо от того, что я ему отправляю, я затем проверяю, что у меня есть как минимум 33 байта расшифрованных данных. Если это так, я хэширую все после первых 32 байтов и смотрю, совпадают ли первые 32 байта с хэшем остальных данных. Казалось, это работает, не раскрывая того, что я делаю. Спасибо за ссылку! - person Mike; 13.02.2016