c - 给定密码验证码,我如何对密码进行反向工程

标签 c passwords primes

验证密码的 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/

相关文章:

c - 如何通过位移位将无符号整数转换为负数?

C# - 比较两个 SecureStrings 是否相等

c# - 如何从测试自动化中的源代码中删除用户名和密码?

python - 为什么我对 project euler 3 的回答不起作用?

c++ - 筛选高达 20 亿给出段错误

c - 为什么我在 C 中创建的新字符串有 ╠ 而不是空格?

c - 将节点插入 Dllist

scala - 使用 scala 使用用户名和密码进行 SSH

javascript - 循环中的 JS 循环

C代码如何更改代码中的返回地址?