AES-128-CTR Шифрование и расшифровку того же файла с MBBE TLS PSA API создает файл с неправильной контрольной суммойC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 AES-128-CTR Шифрование и расшифровку того же файла с MBBE TLS PSA API создает файл с неправильной контрольной суммой

Сообщение Anonymous »

Я написал эти функции с помощью небольшого изменения некоторого примера кода, чтобы алгоритм был CTR и использует несколько ключей. Кажется, я где -то испортился, так как расшифровка не создает исходный файл. Вот функции, которые я написал (btw u8 использует псевдоним для uint8_t и u64 - это то, что используется псевдоним для uint64_t )

Код: Выделить всё

void encryptFile(std::vector keys, std::filesystem::path inpath, std::filesystem::path outpath)
{
u64 in_len = std::filesystem::file_size(inpath);
std::ifstream in(inpath, std::ios::binary);
std::ofstream out(outpath, std::ios::binary);
uint8_t plaintext[in_len];
uint8_t output[in_len];
for (u64 i = keys.size() - 1; i < keys.size(); i--)
{
enum {
block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES),
};
psa_status_t status;
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
psa_algorithm_t alg = PSA_ALG_CTR;
in.read(reinterpret_cast(&plaintext), in_len);
uint8_t iv[block_size];
size_t iv_len;
size_t output_len;
psa_key_id_t key_id;
psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
status = psa_crypto_init();
if (status != PSA_SUCCESS)
{
printf("Failed to initialize PSA Crypto\n");
return;
}
psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
psa_set_key_algorithm(&attributes, alg);
psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
psa_set_key_bits(&attributes, 128);
status = psa_import_key(&attributes, keys[i].data(), keys[i].size(), &key_id);
if (status != PSA_SUCCESS) {
printf("Failed to import a key\n");
return;
}
psa_reset_key_attributes(&attributes);

/* Encrypt the plaintext */
status = psa_cipher_encrypt_setup(&operation, key_id, alg);
if (status != PSA_SUCCESS) {
printf("Failed to begin cipher operation\n");
return;
}
status = psa_cipher_generate_iv(&operation, iv, sizeof(iv), &iv_len);
if (status != PSA_SUCCESS) {
printf("Failed to generate IV\n");
return;
}
status = psa_cipher_update(&operation, plaintext, sizeof(plaintext),
output, sizeof(output), &output_len);
if (status != PSA_SUCCESS) {
printf("Failed to update cipher operation\n");
return;
}
status = psa_cipher_finish(&operation, output + output_len,
sizeof(output) - output_len, &output_len);
if (status != PSA_SUCCESS) {
printf("Failed to finish cipher operation\n");
return;
}
/* Clean up cipher operation context */
psa_cipher_abort(&operation);

/* Destroy the key */
psa_destroy_key(key_id);

mbedtls_psa_crypto_free();
memcpy(plaintext, output, in_len);
}
out.write(reinterpret_cast(&output), in_len);
in.close();
out.close();
}

void decryptFile(std::vector keys, std::filesystem::path inpath, std::filesystem::path outpath)
{
u64 in_len = std::filesystem::file_size(inpath);
std::ifstream in(inpath, std::ios::binary);
std::ofstream out(outpath, std::ios::binary);
uint8_t plaintext[in_len];
uint8_t output[in_len];
for (u64 i = 0; i < keys.size();  i++)
{
enum {
block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES),
};
psa_status_t status;
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
psa_algorithm_t alg = PSA_ALG_CTR;
in.read(reinterpret_cast(&plaintext), in_len);
uint8_t iv[block_size];
size_t iv_len;
size_t output_len;
psa_key_id_t key_id;
psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
status = psa_crypto_init();
if (status != PSA_SUCCESS)
{
printf("Failed to initialize PSA Crypto\n");
return;
}
psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
psa_set_key_algorithm(&attributes, alg);
psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
psa_set_key_bits(&attributes, 128);
status = psa_import_key(&attributes, keys[i].data(), keys[i].size(), &key_id);
if (status != PSA_SUCCESS) {
printf("Failed to import a key\n");
return;
}
psa_reset_key_attributes(&attributes);

/* Encrypt the plaintext */
status = psa_cipher_decrypt_setup(&operation, key_id, alg);
if (status != PSA_SUCCESS) {
printf("Failed to begin cipher operation\n");
return;
}
status = psa_cipher_generate_iv(&operation, iv, sizeof(iv), &iv_len);
if (status != PSA_SUCCESS) {
printf("Failed to generate IV\n");
return;
}
status = psa_cipher_update(&operation, plaintext, sizeof(plaintext),
output, sizeof(output), &output_len);
if (status != PSA_SUCCESS) {
printf("Failed to update cipher operation\n");
return;
}
status = psa_cipher_finish(&operation, output + output_len,
sizeof(output) - output_len, &output_len);
if (status != PSA_SUCCESS) {
printf("Failed to finish cipher operation\n");
return;
}
/* Clean up cipher operation context */
psa_cipher_abort(&operation);

/* Destroy the key */
psa_destroy_key(key_id);

mbedtls_psa_crypto_free();
memcpy(plaintext, output, in_len);
}
out.write(reinterpret_cast(&output), in_len);
in.close();
out.close();
}
Я ожидал, что идентичные файлы будут созданы путем запуска EncryptFile , а затем DecryptFile . Я не получил такой же файл обратно.

Подробнее здесь: https://stackoverflow.com/questions/796 ... api-produc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»