Я написал эти функции с помощью небольшого изменения некоторого примера кода, чтобы алгоритм был CTR и использует несколько ключей. Кажется, я где -то испортился, так как расшифровка не создает исходный файл. Вот функции, которые я написал (btw u8 использует псевдоним для uint8_t и u64 - это то, что используется псевдоним для uint64_t )
Я написал эти функции с помощью небольшого изменения некоторого примера кода, чтобы алгоритм был CTR и использует несколько ключей. Кажется, я где -то испортился, так как расшифровка не создает исходный файл. Вот функции, которые я написал (btw u8 использует псевдоним для uint8_t и u64 - это то, что используется псевдоним для uint64_t ) [code]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);
/* 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(); } [/code] Я ожидал, что идентичные файлы будут созданы путем запуска EncryptFile , а затем DecryptFile . Я не получил такой же файл обратно.