不久前,我了解到,如果代码验证循环如下所示,则可以使用以下方法对代码进行解密:
char *code, *user_input; /* assume the pointers are pointing valid data */
while(*code++ == *user_input++); /* go over char by char */
printf((*p == '\n' && q == code + strlen(code)) ? "ok\n" : "fail\n");
如果这是代码验证循环,那么我可以提供输入,并检查循环返回 fail 会花费多少时间。如果花了X个时钟周期,我就在第一个字符处,在第二个字符处-在第二个字符处也是如此,依此类推...
隐藏这种类型的循环所引起的数据的方法是增加延迟,限制用户输入(不能蛮力)或反过来遍历整个循环。
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
int main()
{
char * code = "1234";
char *user_input;
size_t len = 16;
while(getline(&user_input,&len, stdin))
{
char *p = user_input, *q = code;
clock_t start = clock();
while(*p == *q){p++, q++;};
printf((*p == '\n' && q == code + strlen(code)) ? "ok\n" : "fail\n");
clock_t end = clock();
printf("%d\nTry again!\n", (int)(end - start));
}
return 0;
}
这是原始解密器的工作方式吗?