From 82cef11d443c71c7d5ebc92f144c2b7ceb4e1cb2 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Wed, 10 Jun 2015 03:06:24 +0300 Subject: add file encryption utils for AES-128-ECB --- utils/aes128ecb_encrypt_file.cpp | 90 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 utils/aes128ecb_encrypt_file.cpp (limited to 'utils/aes128ecb_encrypt_file.cpp') diff --git a/utils/aes128ecb_encrypt_file.cpp b/utils/aes128ecb_encrypt_file.cpp new file mode 100644 index 0000000..aba8569 --- /dev/null +++ b/utils/aes128ecb_encrypt_file.cpp @@ -0,0 +1,90 @@ +/** + * \file + * \author Egor Tensin + * \date 2015 + * \copyright This file is licensed under the terms of the MIT License. + * See LICENSE.txt for details. + */ + +extern "C" +{ +#include +} + +#include + +#include +#include +#include +#include + +namespace +{ + void exit_with_usage() + { + std::cout << "Usage: aes128ecb_encrypt_file.exe KEY SRC DEST\n"; + std::exit(EXIT_FAILURE); + } + + std::ifstream::pos_type get_file_size(const std::string& path) + { + std::ifstream ifs(path, std::ifstream::binary | std::ifstream::ate); + return ifs.tellg(); + } +} + +int main(int argc, char** argv) +{ + AesBlock128 key; + Aes128KeySchedule key_schedule; + + if (argc != 4) + exit_with_usage(); + + if (parse_aes_block128(&key, argv[1]) != 0) + { + std::cerr << "Invalid 128-bit AES block '" << argv[1] << "'\n"; + exit_with_usage(); + } + + try + { + const std::string src_path(argv[2]); + const std::string dest_path(argv[3]); + + const auto src_size = get_file_size(src_path); + + std::ifstream src_ifs; + src_ifs.exceptions(std::ifstream::badbit | std::ifstream::failbit); + src_ifs.open(src_path, std::ifstream::binary); + + std::vector src_buf; + src_buf.reserve(static_cast::size_type>(src_size)); + src_buf.assign(std::istreambuf_iterator(src_ifs), + std::istreambuf_iterator()); + + aes128_expand_key_schedule(key, &key_schedule); + + const auto dest_size = aes128ecb_encrypt_file( + src_buf.data(), static_cast(src_size), NULL, &key_schedule); + + std::vector dest_buf(static_cast::size_type>(dest_size)); + + aes128ecb_encrypt_file(src_buf.data(), + static_cast(src_size), + dest_buf.data(), + &key_schedule); + + std::ofstream dest_ofs; + dest_ofs.exceptions(std::ofstream::badbit | std::ofstream::failbit); + dest_ofs.open(dest_path, std::ofstream::binary); + dest_ofs.write(reinterpret_cast(dest_buf.data()), dest_buf.size()); + } + catch (const std::exception& e) + { + std::cerr << e.what() << "\n"; + return 1; + } + + return 0; +} -- cgit v1.2.3