我试图强行使用简单的对称加密算法。 所以我这样做:
#define MAX_LEN 100
unsigned int i;
char *message;
char* cipher = readFileBytes("secret_msg.bin");
for (i = 0; i <4294967295; i++){
if (decrypt(cipher,i,message, 0) == true){
cout<<message<<endl;
cout<<"hacked!";
break;
}
}
我知道密钥是一些无符号整数。问题是我得到了分段错误,因为据我所知,我超出了分配的调用堆栈大小。如果我评论if
语句并将其更改为cout<<i;
,我可以看到我的for循环正在按预期运行。
这是我的解密代码:
bool decrypt(char *c, unsigned int k,char *m){
int i;
for (i=0;i<MAX_LEN; i+=4){
m[i] = c[i] ^ (k&0x00ff);
m[i+1] = c[i+1] ^ (k >> 8);
m[i+2] = c[i+2] ^ (k >> 16);
m[i+3] = c[i+3] ^ (k >> 24);
}
string result(c);
for (int i = 0; i < result.length(); i++) {
if (result[i] == 'j' && result[i+1] == 'u' && result[i+2] == 's' && result[i+3] == 't') {
return true;
}
}
return false;
}
编辑: 如果我注释掉解密的内部代码,它会起作用,当我首先添加for循环时,我开始收到错误。
EDIT2: 如果我尝试cout&lt;我得到Segmentation错误,当然它在这里是null。我可以cout&lt;
答案 0 :(得分:2)
cipher
和message
似乎是字符数组。我猜MAX_LEN
是他们的大小。
如果是这样,您将超出decrypt()
范围内的范围:您对i+3
和c
的元素m
进行了处理,其中i
可以是{{} 1}}。所以你在数组的边界之外写了3个元素。这是缓冲区溢出和segfault最可能的原因。
要解决您的问题,请整理您的循环以确保MAX_LEN-1
,其中i<message_size-3
将是message_size
内容的实际大小。
补充说明:
cipher
的最后一个参数没用,因为你在循环开始时将它重置为0。
您应该向decrypt()
传达实际大小的输入:在您的缓冲区中,加密的消息可能后面是垃圾,尝试解密它将是浪费时间。
此外,请记住,对于数组,decrypt()
无法知道缓冲区的大小:decrypt()
是指针sizeof(m)
的大小。因此,我建议改为选择m
。
请注意,由于此std::string
问题,decrypt()
末尾的消息输出可能不会输出太多。
顺便说一句,您的解密方案显然使用块密码,块长度为4.因此检查sizeof
是否是4的倍数是有意义的。或者您可以按顺序更改代码能够使用不完整的块。