-1

我正在使用我在网上找到的 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");

所以我需要一个像“填充”这样的解决方案,但我不知道一个简单的算法。请帮助我以一种好的方式加密/解密文件。

4

4 回答 4

3

首先,我想指出 DES 适用于 64 位块(使其成为 8 字节,而不是 64 位),正如您在http://en.wikipedia.org/wiki/Data_Encryption_Standard中看到的(检查数据块大小)。

现在您正在寻找一些填充(以及在解密时取消填充)。您可以查看http://en.wikipedia.org/wiki/Padding_(cryptography)

我个人喜欢 PKCS#7,因为它很简单,并且与标准尺寸相比通常会增加一点开销。

对于加密:

  • 检查您刚刚从文件中读取的块的大小
  • 如果它是 64 位,则添加一个新块 [8,8,8,...8],否则,用丢失的字节数填充它(参见下面的示例)
  • 加密
  • 请注意,LAST 数据包始终包含该算法的填充(最坏的情况是 8 个字节的填充)

例子:

  • 读取 0a 0b 0c,缺少 5 个字节以适合 8 个字节
  • 填充数据包:0a 0b 0c 05 05 05 05 05

对于解密:

  • 读包
  • 解密
  • 如果是最后一个数据包,检查最后一个字节的值(比如它是n
  • 删除数据包末尾的n个字节

希望这会让它更清楚并帮助你

编辑

如果您的输入文件是纯文本,您可以用 0 填充,如果它是二进制文件(并且必须是因为您将其作为二进制文件打开),PKCS#7 更好

想想这样创建的文件:dd if=/dev/zero of=temp.zero count=100 几百字节的零,什么是填充,什么不是?

实施非常简单:

  • 思考memset
  • 如果 ile 是 8 的倍数,不要忘记添加最后一个块

顺便说一句,如今 DES 已严重损坏,如果涉及安全性,您应该考虑使用像样的密码(至少考虑 AES,请查看http://en.wikipedia.org/wiki/Data_Encryption_Standard#Replacement_algorithms

于 2013-07-08T12:30:07.737 回答
0

我不确定您使用 DES 的目的是什么,但如果您实际上是在尝试保护您正在加密的数据,那么您真的应该使用其他东西。DES 不再安全。

另外,我想一个好的图书馆会为你做填充。

于 2013-07-08T21:14:54.353 回答
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);
}
于 2013-07-08T11:37:32.030 回答
0

首先不要使用DES!DES 被破坏并且可以很快地被暴力破解。其次,您使用的是 ECB 模式,您可以在wiki上阅读为什么要避免使用这种模式。您的数据可能会被篡改,而且您不会知道这一点 - 使用GCM等AE模式。就像前面提到的人一样,DES 有 64 位而不是字节块大小,即 8 字节。

于 2013-07-09T19:53:48.110 回答