Некоторое время назад я узнал, что есть возможность расшифровать код, используя следующий метод, если цикл проверки кода выглядит примерно так:
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 тактов, я был на 1-м символе, 2X - на 2-м, и так далее ...
Способ скрыть данные, полученные из цикла этого типа, состоял в том, чтобы добавить задержку, ограничить пользовательские вводы (не может перебор) или перебрать весь цикл в любом случае.
#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;
}
Так работают примитивные расшифровщики?