验证密码的 C 代码:
bool check(const char *password)
{
int val=1,pospassword=0,posletters;
int primes [] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
char letters []= "abcdefghijklmnopqrstuvwxyz";
do {
posletters=0;
do {
if (password[pospassword]==letteres[posletters])
val*=primes[posletters];
} while(++posletters<26);
} while (password[++pospassword]!='\0');
if (val==1066849907)
return true;
return false;
}
有没有办法从这段代码中对密码进行逆向工程?
编辑:该数字的因数是:2237 和 476911。这就是问题所在,因为在前 26 个素数中找不到它们。
最佳答案
它只是将与密码中的字符相匹配的数字相乘,顺序无关紧要,因此您只需要对数字进行因式分解即可。由于 val 是一个 32 位值,因此乘法可能会溢出,这使情况变得复杂。在这种情况下,最简单的匹配密码会出现 16527 次。要解决这个难题,您需要使用 64 位整数来暴力破解溢出的次数并尝试分解每个选项。简单地尝试所有小写字符串也可以,密码只有 9 个字母。
关于c - 给定密码验证码,我如何对密码进行反向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20032374/