我在学校有一项作业,在那里我需要使用标准库在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字符,我还尝试在填充0之前插入'\r\n‘,以及我在这里使用的指南http://page.math.tu-berlin.de/~kant/teaching/hess/krypto-ws2006/des.htm,但是我尝试过的所有东西似乎都没有修复它。
当谈到填充时,我是遗漏了什么,还是在将0 (nul)添加到末尾之前,我需要用什么特殊的字符来结束我的内容?
发布于 2018-04-09 23:53:49
谢谢Joker_vD的解决方案
这个问题源于openssl #5(或维基百科的PKCS #7 )没有正确地填充。通过改变线路
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);程序开始正常运行。
https://stackoverflow.com/questions/49727945
复制相似问题