簡體   English   中英

C中的crypt函數在for循環中破壞密碼字符串

[英]crypt function in C breaking password string in for loop

我是C語言的新手,而且我一直在學習CS50課程,以學習一些基礎知識。 我一直在嘗試解決要求您做一個簡單的密碼破解程序的挑戰,但是遇到一個阻止我編寫功能程序的問題:每次在for循環中調用crypt函數時,都會以某種方式破壞密碼我正在遍歷的字符串。

我嘗試過復制密碼字符串,並將其作為參數傳遞給crypt; 我還嘗試過將crypt調用移到一個單獨的函數中,然后從循環中調用它(以及兩者的結合)

#define _XOPEN_SOURCE
#include <unistd.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

string buildLetterDictionary();

int main(int argc, string argv[])
{
    if (argc == 2)
   {
        printf("Two arguments, starting test...\n");

        char password[2];
        string letters = buildLetterDictionary();
        for(int i = 0; i < 5; i++)
        {
            password[0] = letters[i];
            password[1] = '\0';
            printf("Password: %s\n", password);
            string hashed = crypt(password, "50");
            printf("\n%i\nOriginal: %s\nHashed: %s\n", i, password, hashed);
        }
        return 0;
    }
    else
    {
        printf("Usage: ./crack hash");
        return 1;
    }
}

string buildLetterDictionary()
{
    char letters[27];
    for(int i = 65; i < 91; i++)
    {
        letters[i-65] = i;
    }
    letters[26] = '\0';
    string letter = letters;
    return letter;
}

如果我注釋掉這些行:

string hashed = crypt(password, "50");
printf("\n%i\nOriginal: %s\nHashed: %s\n", i, password, hashed);

該代碼按預期工作,並產生輸出:

A
B
C
D
E

但是,如果我保留這些行,則密碼第一次以散列為“ 50pe4e2XTIS / g”的形式輸出為'A',但隨后的所有時間都以散列為“ 50sXZPq5euCxs”的形式以“”形式輸出

請讓我知道潛在的問題是什么,以便我可以努力解決它! 感謝您的任何幫助!

我在這里猜測cs50.h包含一些定義,例如char *教授為簡化起見而給出的string的類型別名

如果是這樣,則buildLetterDictionary()無法正常工作,因為您正在執行以下操作:

char letters[27];
...
char * letter = letters;
return letter;

這意味着您將返回一個局部變量的地址,該變量將在離開函數后立即銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM