C 给定密码验证代码,如何对密码进行反向工程

C 给定密码验证代码,如何对密码进行反向工程,c,passwords,primes,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 {

验证密码的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;
}
bool检查(常量字符*密码)
{
int val=1,pospassword=0,posletters;
int素数[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97101};
字符字母[]=“abcdefghijklmnopqrstuvwxyz”;
做{
poslets=0;
做{
if(密码[pospassword]==字母[poslets])
val*=素数[字母];

}而(++posletters这段代码的作用似乎是匹配密码,而不管它的出现顺序如何。 例如,如果我的密码是“BugsBunny”,它将接受“BBgnsuuy”。
您可以获得该值,但不能获得原始顺序。

它只是将密码中匹配字符的数字相乘,顺序无关紧要,因此您只需将数字进行因子运算。val是一个32位值,因此乘法可能会溢出。在这种情况下,最简单的匹配会发生16527次g密码。要解决此难题,您需要使用64位整数强制计算溢出数,并尝试对每个选项进行因子分解。只需尝试所有小写字符串也可以,密码只有9个字母。

此方法将始终返回false,因为变量“val”永远不会有值1066849907,因为2237和476911(相乘得到该值的素数)不在素数数组中。
因此,要么没有有效密码要么代码中有错误,应该有一个与1066849907不同的号码。
无论如何,这是一种非常低效且不安全的密码验证方法。它忽略“password”中的所有大写字母、所有数字和特殊字符,并且不考虑字符在密码字符串中的位置。
例如,如果最后一个条件是

if (val == 30)
然后,以下所有密码都将作为有效密码传递:“abc”、“acb”、“bac”、“bca”、“cab”、“cba”、“123aSOMEcCHARSbHERE!$#”…

基本上只要与“val”比较的数字可以作为素数数组中素数的乘积来划分。有无限多的字符串可以作为有效密码传递。

您尝试过暴力吗?您可以随时对其进行暴力攻击,并系统地检查每个可能的字符串,直到得到值。您所要做的就是将数字乘以因子,然后查看包含哪些字母在密码中。是的,因为你只需要担心前26个素数,这是一个简单的因式分解。而且任何非小写字母都不会影响结果。你被截短了。
1066849907
不是这些素数的倍数;)32位整型如何?你是如何推断密码有9个字母的?用户1490466:通过在不到一秒钟的时间内对不适合整型的val位进行强制执行。下一个可能的密码不太可能是15个字母的组合。