首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ DES算法不断生成不正确的最终块

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

Stack Overflow用户
提问于 2018-04-09 07:49:30
回答 1查看 110关注 0票数 1

我在学校有一项作业,在那里我需要使用标准库在C++中编写DES程序。我已经完成了大部分算法,但是与我们用来验证的openssl des-cbc相比,最后的块没有正确地加密。其他的块都正常工作,所以我想这和我的垫子有关。

代码语言:javascript
复制
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字符,我还尝试在填充0之前插入'\r\n‘,以及我在这里使用的指南http://page.math.tu-berlin.de/~kant/teaching/hess/krypto-ws2006/des.htm,但是我尝试过的所有东西似乎都没有修复它。

当谈到填充时,我是遗漏了什么,还是在将0 (nul)添加到末尾之前,我需要用什么特殊的字符来结束我的内容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-09 23:53:49

谢谢Joker_vD的解决方案

这个问题源于openssl #5(或维基百科的PKCS #7 )没有正确地填充。通过改变线路

代码语言:javascript
复制
if(content.size()%8 != 0) content.append(8-(content.size()%8), 0);

代码语言:javascript
复制
if(content.size()%8 != 0) content.append(8-(content.size()%8), 8-content.size()%8);
else content.append(8, 8);

程序开始正常运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49727945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档