我正在使用我在网上找到的DES算法。它工作正常,但我有一个问题。 如您所知,DES加密/解密每个64字节的块。但是如果在一个大文件中最后一个块没有以64字节块边界结束会发生什么呢?我知道,会有错误。
我正在使用以下代码:
Des d1;
char *plaintext=new char[64];
char *chyphertext=new char[64];
h.open("requisiti.txt",ios::in|ios::binary);.
k.open("requisiti2.txt",ios::out|ios::binary);
while(!h.eof())
{
h.read(plaintext,64);
chyphertext=d1.Encrypt(plaintext);
//decryption is the same.just change Encrypt to Decrypt
k.write(chyphertext,64);
}
h.close();
k.close();
remove("requisiti.txt");
rename("requisiti2.txt","requisiti.txt");
所以我需要像“填充”这样的解决方案,但我不知道一个简单的算法。请帮我加好/解密文件。
答案 0 :(得分:3)
首先,我想指出DES可以在64位块上运行(使其成为8字节,而不是64位),正如您在http://en.wikipedia.org/wiki/Data_Encryption_Standard中看到的那样(检查数据块大小)。
现在你正在寻找一些填充(并在解密时取消填充)。您可以查看http://en.wikipedia.org/wiki/Padding_(cryptography)
我个人喜欢PKCS#7因为它很容易,并且与标准尺寸相比通常会增加一点开销。
加密:
示例:
解密:
希望这能让它更清晰,更有帮助
修改强>
如果你的输入文件是纯文本,你可以填0,如果它是二进制(并且它必须是因为你打开它作为二进制),PKCS#7更好
考虑一下这样创建的文件:dd if=/dev/zero of=temp.zero count=100
几百个字节的零,什么是填充,什么不是?
实施非常简单:
memset
顺便说一下,DES现在已经严重破坏,你应该考虑使用一个体面的密码,如果担心安全性(至少考虑AES,检查http://en.wikipedia.org/wiki/Data_Encryption_Standard#Replacement_algorithms)
答案 1 :(得分:0)
首先:永远不要使用eof()
来检查文件是否到达,因为它不能预测文件的结尾。
while(h.read(plaintext,64))
{
if (std::h.gcount() < 64) // gcount returns the number of characters extracted by the last unformatted input operation.
for (int i=std::h.gcount(); i<64; i++)
paintext[i] = 0; // pad the last block
chyphertext=d1.Encrypt(plaintext);
//decryption is the same.just change Encrypt to Decrypt
k.write(chyphertext,64);
}
答案 2 :(得分:0)
我不确定你使用的是什么,但如果你真的试图保护你正在加密的数据,那么你应该使用别的东西。 DES不再安全。
另外,我认为一个好的库会为你做填充。
答案 3 :(得分:0)