2017-05-23 3 views
1

私はCS50のweek2 psetをやっています。 crypt関数を使用する場合、任意の文字列の暗号文を指し示すcharポインタは、常に暗号化された最後のものを指します。例えば :crypt.hからのcrypt()の使用

char password[] = "AAAA"; 
char toCrack[] = "AAzz"; 
printf("%s\n", password); 
printf("%s\n", toCrack); 

char *toCrackCiph = crypt(toCrack, "da"); 
char *passwordCiph = crypt(password, "aa"); 


printf("%s\n", passwordCiph); 
printf("%s\n", toCrackCiph); 

toCrackCiphとpasswordCiphは、それらの文字列が同じでなくても、お互いに等しく、そしてどちら塩ではありません。

私は単純なポインタエラーをどこかに作っていますか?

おかげで、

答えて

5

(私はCS50に精通していないです。私はcryptは伝統的なUnix標準Cライブラリから関数crypt(3)であるという仮定の下で、この質問に答えるのです。)

cryptは非常に古いですCのスレッドセーフについて心配していた人たちの前日から、と同じポインタを返し、Cライブラリ内の静的バッファを指しています。各コールは、以前のコールの結果を上書きします。あなたは再びそれを呼び出す前に、最初のcrypt呼び出しの結果をプリントアウトした場合

...

#include <stdio.h> 
#include <unistd.h> 

int 
main(void) 
{ 
    char password[] = "AAAA"; 
    char toCrack[] = "AAzz"; 
    printf("%s\n", password); 
    printf("%s\n", toCrack); 

    char *toCrackCiph = crypt(toCrack, "da"); 
    printf("%s\n", toCrackCiph); 

    char *passwordCiph = crypt(password, "aa"); 
    printf("%s\n", passwordCiph); 
    return 0; 
} 

を...そしてあなたは、2つの異なる文字列が表示されます。コンピュータの出力は

AAAA 
AAzz 
daeBW5vt16USo 
aaI8pRQwCn7N2 

です。以前のDESベースのパスワードハッシュアルゴリズムを要求する塩ストリングを使用しているので、同じことを取得する必要があります。

これは教室での練習ですが、古いDESベースのパスワードハッシュは現代のコンピュータでも暴力によって壊れる可能性があるので、実際のパスワードには使用しないでください。 "$5$bpKU3bUSQLwX87z/$"のような塩ストリングの別のスタイルを指定すると、おそらくより良いアルゴリズムを使用できます。

関連する問題