文件解密显示原始和密文?
Decrypt of file displays both original and cipher text?
我正在使用 Crypto++ 加密和解密文件。在加密中,生成 key
和随机 IV
并且 hexencoded
文件中的文本被加密。 IV
和 cipher
文本都写入同一个文件。
在解密中,使用与加密相同的标准生成key
,并从文件中提取随机IV
和hexdecoded
。 iv
长度后的文本存储在字符串中并解密。
我可以看到原始文件,所以我知道它正在工作,但它还在原始文件文本之后显示 cipher
文本。有没有人怎么解决的?
//some code to declare variables, read from file and so on
unsigned char * inputContent = (unsigned char *) malloc(fileSize * sizeof(char)); //create char array of same size as file content
//inputContent is for storing file data
string rawString(reinterpret_cast<char*>(inputContent), fileSize); //convert char array to string
//extract iv, key and cipher from rawString
string rawIV;
rawIV = rawString.substr(0, 32);
//code to hexdecode iv
string cipher;
cipher = rawString.substr(32, fileSize - 32);
string recovered;
CBC_Mode< AES >::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv);
StringSource s_recover(cipher, true,
new StreamTransformationFilter(d,
new StringSink(recovered)
)
);
const char * writeContent = recovered.c_str();
if(pwrite(fd, writeContent, recovered.length(), 0) <= 0)
{
return -1; //error
}
提前致谢。 ☺
您可以试试这样的方法。但是很难说它是否真的有效,因为它不清楚你到底在做什么,也不清楚问题出在哪里。
FileSource fs("<filename>", false /*pumpAll*/);
SecByteBlock key(AES::DEFAULT_KEYLENGTH), iv(AES::BLOCKSIZE);
// Fetch key from somewhere
key = ...;
// Fetch IV from file
fs.Detach(new HexDecoder(new ArraySink(iv, iv.size()));
fs.Pump(32);
CBC_Mode< AES >::Decryption dec;
dec.SetKeyWithIV(key, key.size(), iv, iv.size());
string recovered;
fs.Detach(new HexDecoder(new StreamTransformationFilter(dec, new StringSink(recovered))));
fs.PumpAll();
您还可以使用以下 if 您得到 SecByteBlockSink
patch:
SecByteBlock recovered;
fs.Detach(new HexDecoder(new StreamTransformationFilter(dec, new SecByteBlockSink(recovered))));
fs.PumpAll();
以下不需要 rawString
:
//create char array of same size as file content
unsigned char * inputContent = (unsigned char *) malloc(fileSize * sizeof(char));
//inputContent is for storing file data
//convert char array to string
string rawString(reinterpret_cast<char*>(inputContent), fileSize);
也许你应该试试:
ArraySource as(inputContent, fileSize, false /*pumpAll*/);
使用 ArraySource
意味着您不复制数据(string
复制数据),它已准备好用于 Crypto++。
此外,由于您已经熟悉 C++ 代码,请使用 unique_ptr
和 new
而不是 malloc
。 unique_ptr
将为您处理清理工作。 (或者,使用 std::vector
)。
unique_ptr<byte[]> buffer(new byte[fileSize]);
我不知道您打算如何使文件描述符在宏伟的计划中发挥作用。 Crypto++ 是一个 C++ 库,C++ 使用 I/O 流。也许这会有所帮助:How to construct a c++ fstream from a POSIX file descriptor?
另见 Retrieving file descriptor from a std::fstream and Getting a FILE* from a std::fstream。
我正在使用 Crypto++ 加密和解密文件。在加密中,生成 key
和随机 IV
并且 hexencoded
文件中的文本被加密。 IV
和 cipher
文本都写入同一个文件。
在解密中,使用与加密相同的标准生成key
,并从文件中提取随机IV
和hexdecoded
。 iv
长度后的文本存储在字符串中并解密。
我可以看到原始文件,所以我知道它正在工作,但它还在原始文件文本之后显示 cipher
文本。有没有人怎么解决的?
//some code to declare variables, read from file and so on
unsigned char * inputContent = (unsigned char *) malloc(fileSize * sizeof(char)); //create char array of same size as file content
//inputContent is for storing file data
string rawString(reinterpret_cast<char*>(inputContent), fileSize); //convert char array to string
//extract iv, key and cipher from rawString
string rawIV;
rawIV = rawString.substr(0, 32);
//code to hexdecode iv
string cipher;
cipher = rawString.substr(32, fileSize - 32);
string recovered;
CBC_Mode< AES >::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv);
StringSource s_recover(cipher, true,
new StreamTransformationFilter(d,
new StringSink(recovered)
)
);
const char * writeContent = recovered.c_str();
if(pwrite(fd, writeContent, recovered.length(), 0) <= 0)
{
return -1; //error
}
提前致谢。 ☺
您可以试试这样的方法。但是很难说它是否真的有效,因为它不清楚你到底在做什么,也不清楚问题出在哪里。
FileSource fs("<filename>", false /*pumpAll*/);
SecByteBlock key(AES::DEFAULT_KEYLENGTH), iv(AES::BLOCKSIZE);
// Fetch key from somewhere
key = ...;
// Fetch IV from file
fs.Detach(new HexDecoder(new ArraySink(iv, iv.size()));
fs.Pump(32);
CBC_Mode< AES >::Decryption dec;
dec.SetKeyWithIV(key, key.size(), iv, iv.size());
string recovered;
fs.Detach(new HexDecoder(new StreamTransformationFilter(dec, new StringSink(recovered))));
fs.PumpAll();
您还可以使用以下 if 您得到 SecByteBlockSink
patch:
SecByteBlock recovered;
fs.Detach(new HexDecoder(new StreamTransformationFilter(dec, new SecByteBlockSink(recovered))));
fs.PumpAll();
以下不需要
rawString
:
//create char array of same size as file content
unsigned char * inputContent = (unsigned char *) malloc(fileSize * sizeof(char));
//inputContent is for storing file data
//convert char array to string
string rawString(reinterpret_cast<char*>(inputContent), fileSize);
也许你应该试试:
ArraySource as(inputContent, fileSize, false /*pumpAll*/);
使用 ArraySource
意味着您不复制数据(string
复制数据),它已准备好用于 Crypto++。
此外,由于您已经熟悉 C++ 代码,请使用 unique_ptr
和 new
而不是 malloc
。 unique_ptr
将为您处理清理工作。 (或者,使用 std::vector
)。
unique_ptr<byte[]> buffer(new byte[fileSize]);
我不知道您打算如何使文件描述符在宏伟的计划中发挥作用。 Crypto++ 是一个 C++ 库,C++ 使用 I/O 流。也许这会有所帮助:How to construct a c++ fstream from a POSIX file descriptor?
另见 Retrieving file descriptor from a std::fstream and Getting a FILE* from a std::fstream。