В моем коде Dart/Flutter у меня есть данные, зашифрованные с помощью ChaCha20-Poly1305-IETF.
Я расшифровываю данные с помощью библиотеки Pointycastle и следующего кода:
Uint8List encryptedData = Uint8List.fromList([...]);
Uint8List nonce = Uint8List.fromList([...]);
Uint8List encryptionKey = Uint8List.fromList([...]);
final ChaCha20Poly1305 chaCha20Poly1305 = ChaCha20Poly1305(ChaCha7539Engine(), Poly1305());
final params = AEADParameters(KeyParameter(encryptionKey), 128, nonce, encryptedData);
chaCha20Poly1305.init(false, params);
decryptedData = chaCha20Poly1305.process(encryptedData); // this can be wrong
У меня теперь такой вопрос: Как узнать, прошла ли расшифровка успешно? Даже если ключ шифрования явно неправильный (например, если я изменю его жестко запрограммировано), decryptedData содержит список данных в конце. Эти данные, конечно, не верны и вызывают проблемы при дальнейшей обработке. Теперь я хотел бы узнать, не удалась ли расшифровка, а затем просто сбросить данные.
Попробуйте реализацию из тестов PointyCastle, которая также учитывает doFinal()
.
Что такое «правильные» данные? Данные не соответствуют ожидаемому шаблону/конвенции или это просто не те данные, которые вы ожидали? Первый шаг к проверке правильности данных — сообщить программе, как вообще выглядят правильные данные.
@Topaco спасибо за ответ. processBytes()
+ doFinal()
мне помогло. Добавим ответ с обновленным кодом.
С помощью решения, предложенного @Topaco, я пришел к следующему результату, который меня устраивает:
final ChaCha20Poly1305 chaChaEngine = ChaCha20Poly1305(ChaCha7539Engine(),
Poly1305());
final params = AEADParameters(KeyParameter(encryptionKey), 128, nonce, Uint8List(0));
chaChaEngine.init(false, params);
decrypted = Uint8List(encryptedData.length - encryptionType.macLength);
int len = chaChaEngine.processBytes(encryptedData, 0, encryptedData.length, decrypted, 0);
try {
len += chaChaEngine.doFinal(decrypted, len);
} catch (e) {
debugPrint('Could not decrypt data: $e');
return null;
}
Насколько я вижу, ChaCha20Poly1305 не содержит реализации
process()
, поэтому вызывается реализация базового класса BaseAEADCipher, которая выполняет толькоprocessBytes()
, но нетdoFinal()
. Однако последний отвечает за аутентификацию.