DES加密/解密

时间:2013-07-08 10:41:54

标签: c++ encryption cryptography des

我正在使用我在网上找到的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 个答案:

答案 0 :(得分: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

答案 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)

首先不要使用DES! DES被打破了,可以很快被强制使用。其次,您正在使用ECB模式,您可以在wiki上阅读为什么要避免使用这种模式。您的数据可能会被篡改,您将无法了解这一点 - 使用AE模式GCM。像前面提到的那样,DES有64位而不是字节块大小,即8字节。