【发布时间】:2019-10-20 18:01:00
【问题描述】:
我有一个任务,我必须为 AES-128 加密实施 Rijndael 算法。我有算法可操作,但我没有正确的文件输入/输出。
赋值要求我们使用从命令行传入的参数。在这种情况下,参数将是用户希望加密的特定文件的文件路径。
我的问题是,我不知道如何读取文件的字节并将这些字节存储在数组中以供以后加密。
我曾尝试使用 ifstream 和 ofstream 来打开、读取、写入和关闭文件,它适用于纯文本文件。但是,我需要应用程序将任何文件作为输入。
当我尝试使用带有 pdf 作为输入的 fstream 的方法时,它会使我的程序崩溃。所以,我现在需要学习如何获取文件的字节,将它们存储在 unsigned char 数组中以进行加密,然后将它们存储在另一个文件中。这个加密和存储密文的过程需要以 16 个字节为间隔发生。
下面的实现是我第一次尝试以二进制模式读取文件,然后将读取的任何内容写入另一个文件,也以二进制模式写入。 输出可在十六进制阅读器中读取。
int main(int argc, char* argv[])
{
if (argc < 2)
{
cerr << "Use: " << argv[0] << " SOURCE_FILEPATH" << endl << "Ex. \"C\\Users\\Anthony\\Desktop\\test.txt\"\n";
return 1;
}
// Store the Command Line Parameter inside a string
// In this case, a filepath.
string src_fp = argv[1];
string dst_fp = src_fp.substr(0, src_fp.find('.', 0)) + ".enc";
// Open the filepaths in binary mode
ifstream srcF(src_fp, ios::in | ios::binary);
ofstream dstF(dst_fp, ios::out | ios::binary);
// Buffer to handle the input and output.
unsigned char fBuffer[16];
srcF.seekg(0, ios::beg);
while (!srcF.eof())
{
srcF >> fBuffer;
dstF << fBuffer << endl;
}
dstF.close();
srcF.close();
}
代码实现没有按预期工作。
任何关于如何解决我的困境的指导将不胜感激。
【问题讨论】:
-
见
std::ifstream::read()。以 binary 模式打开文件,因此不会发生翻译。不要使用operator>>,因为那是文本;二进制文件(如加密数据)可能包含不可打印的数据。 -
言语无法形容这对我有多大帮助。谢谢托马斯。