C ++ DES算法不断生成不正确的最终块

时间:2018-04-09 07:49:31

标签: c++ openssl des

我有一份学校作业,我需要使用标准库在C ++中编写DES。我已经完成了大部分算法,但是与我们用来验证的openssl des-cbc相比,最终的块没有正确加密。其他块都正常工作,所以我认为它与我的填充

有关
void des::get_mes_data(std::string mes_file){
    std::ifstream mes_in(mes_file, std::ios::binary);
    std::string content;
    std::getline(mes_in, content, std::string::traits_type::to_char_type(std::string::traits_type::eof()));

    //error seems to be here since last block is the only block affected
    if(content.size()%8 != 0) content.append(8-(content.size()%8), 0);
    //end error

    for(char c : content){
        if(c == 0) std::cout<<" NULL "<<std::endl;
        else if( c == EOF) std::cout<<" EOF "<<std::endl;
        else std::cout<<c;
    }
    std::string mes_bin="";
    for(int i = 0; i < content.size(); i++){
        mes_bin += char_to_bin(content[i]);
        if(mes_bin.size() == 64){
            m_mes_data.push_back(mes_bin);
            mes_bin = "";
        }
    }
}

我尝试在填充0之前在内容的末尾插入EOF字符,我也尝试插入&#39; \ r \ n&#39;在使用0以及我在http://page.math.tu-berlin.de/~kant/teaching/hess/krypto-ws2006/des.htm使用的指南之前填充之前,但我尝试的所有内容似乎都无法修复它。

在填充方面我是否遗漏了某些内容,或者在添加0(nul)到最后之前是否需要使用某些特殊字符来结束我的内容?

1 个答案:

答案 0 :(得分:0)

感谢Joker_vD的解决方案

问题出现在openssl PKCS#5(或PKCS #7 on wikipedia)之后没有正确填充。通过更改行

if(content.size()%8 != 0) content.append(8-(content.size()%8), 0);

if(content.size()%8 != 0) content.append(8-(content.size()%8), 8-content.size()%8);
else content.append(8, 8);

程序开始正常填充。