質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Q&A

解決済

3回答

2158閲覧

c パスワード解析の時間計測をするが、文字数を変えても時間が変化しない

st-riefu274

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

0グッド

0クリップ

投稿2021/08/02 09:13

編集2021/08/02 11:57

前提・実現したいこと

自分でパスワードを入力し、それを解析して、解析にかかる時間を調べるプログラムを組んでいます。(パスワードは大文字、小文字、数字の62種類)

発生している問題・エラーメッセージ

パスワードの文字数を1~12の範囲で変えても、解析にかかる時間がほとんど変わりません。
(0.000018秒程度)
調べたところ文字数が増えれば、時間が変わっていくのですが…
例 参照サイトでは6文字は約5日
参照 https://japan.norton.com/brute-force-attack-9215

該当のソースコード

C

1#include<stdio.h> 2#include<time.h> 3 4int main(void){ 5 int i, j; 6 long begin, end; 7 char p[] = {"password2002"}, x[63] = {"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"}, y[] = {}; /*pにパスワードを入れる、yは出力用の配列*/ 8 9 begin = clock();/*時間計測開始*/ 10 for(i = 0; i < 12; i++){/*パスワード解析*//*iはパスワードの文字数未満にする*/ 11 for(j = 0; j < 63; j++){ 12 if(p[i] == x[i]){ 13 y[i] = x[j]; 14 break; 15 } 16 } 17 } 18 for(i = 0; i < 12; i++){/*解析したパスワードを出力*/ 19 printf("%c", y[i]); 20 } 21 end = clock();/*計測終了*/ 22 23 printf("\n解析終了\n"); 24 printf("Time = %lf sec\n", (double)(end - begin) / CLOCKS_PER_SEC);/*時間を出力*/ 25 26 return 0; 27}

試したこと

パスワードをp,pa,pas,pass,passw,~,password2021
というように変えていっても、時間は0.000016から0.000019の範囲に収まってしまいます。

補足情報(FW/ツールのバージョンなど)

google colaboratoryを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/08/02 09:27 編集

> 文字数が増えれば、本来は時間が変わっていくと思う 数文字の増減だけで何秒も変わると思われているとしたら、スケール感が違うのではないでしょうか。 やるからには何十何百何千文字~と可能なレベルで幾つも何度も試してそれをグラフにプロットする等してみては如何でしょう。 そもそも「解析にかかる時間を調べるプログラム」ですのにその結果を「正しい数値なのでしょうか?」と聞くのはおかしくありませんか。
kaina

2021/08/02 09:19

ご自分でデバッグしてみましたか? 以下のif文はjのループ内で変化しますか? if(p[i] == x[i]){
int32_t

2021/08/02 09:36 編集

未定義動作を踏んで、コンパイラにかなりコードを消されてませんか? 私の環境でコンパイルしてみたら、2重ループは消えてました。putchar * 20 しか残ってませんでした。
st-riefu274

2021/08/02 09:48

kainaさん、ご指摘ありがとうございます。 こちらの書き間違いで、正常に作動しています。
st-riefu274

2021/08/02 09:54

jimbeさん、ご意見ありがとうございます。 正しい数値という言葉は適切ではないですね。 ネットでパスワード解析にかかる時間を調べ、その時間に比べて明らかに異なっていたため、「正しいのか」と質問しました。(もちろん、素人が組んだもの程度で正確になるわけがないのですが。)
hoshi-takanori

2021/08/02 10:20

パスワードはハッシュ化して保存するのが鉄則であり、ハッシュ化されたものから元のパスワードを解析しないと意味ないのでは…。
jimbe

2021/08/02 10:57

> ネットでパスワード解析にかかる時間を調べ ということですので、その情報へのリンクもご提示頂いて、「リンク先では〇〇秒と出ているがこのコードでは・・・」という展開にされては如何でしょう。
episteme

2021/08/02 11:38

アルファベット26種/8文字として全組み合わせは 26^8 = 208x10^9 ひとつ 1ナノ秒でも 208秒かかります。
kansuke_t

2021/08/02 16:38

解析したパスワードを出力のprintfは計測終了のあとにしたほうがよいのではないでしょうか。
guest

回答3

0

この処理内容だと,
(pの長さ×62回)の比較をするだけなので,そうそう変わらないのは当たり前かと.

投稿2021/08/02 09:17

fana

総合スコア11632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/08/02 09:21 編集

パスワードって本来,各文字単位で正否がわかるものではないハズ. 例えば, "Cat32API" とかでトライしたら「それは違う」とわかるだけで, このとき,「先頭の 'C' は当たってるけどね」とかわからないっしょ.
st-riefu274

2021/08/02 09:59

早速のご返答ありがとうございます。 確かにその通りですね。
fana

2021/08/02 10:05

文字数がNのとき,パスワードは 62^N パターンあり,個々のパターンでトライするとそれが正解かどうかだけがわかる. (しかも一般にNも不明である) っていう世界で,「総当たりでトライしてやらぁ!」っていうのが本来やりたいことなんじゃないかな,と.
st-riefu274

2021/08/02 11:49

N文字のパスワードを1まとまりとして、62^N個パスワードがあり、総当たりする感じですね? そう考えると確かにやっていることは違う気がします。
guest

0

ベストアンサー

つまり、如何にして利用可能文字全部を使って一定文字長までの全パターンを生成するか、ということになります。
62文字使うなら62進数を考えるのが簡単でしょうか。

do-while 内の printf を有効にすると y の変化が見えます。(その分遅くなりますが。)
x の最初の文字は使いません。index[i] の 0 を使わないためです。(index を -1 で初期化すればいいだけですけどね^^; )

c

1#include<stdio.h> 2#include<string.h> 3#include<time.h> 4 5//最大パスワード長 6#define MAXLEN 16 7 8int main(void){ 9 int i, carry; 10 long begin, end; 11 /*pにパスワードを入れる、yは出力用の配列*/ 12 char p[] = {"password"}; 13 const char *x = "*0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 14 char y[MAXLEN+1] = {0}; 15 int index[MAXLEN+1] = {0}; 16 17 printf("解析開始\n"); fflush(stdout); 18 begin = clock();/*時間計測開始*/ 19 do{ 20 //printf("y=%s\n",y); 21 if(!strcmp(p,y)) break; //found 22 23 for(i=0, index[i]++, carry=!0; carry; i++) { 24 carry = index[i] >= strlen(x); 25 if(carry) { 26 index[i+1]++; 27 index[i]=1; 28 } 29 y[i] = x[index[i]]; 30 } 31 32 }while(index[MAXLEN] == 0); 33 end = clock();/*計測終了*/ 34 35 if(index[MAXLEN] == 0) { 36 printf("found: %s\n", y); 37 } else { 38 printf("NOT found.\n"); 39 } 40 printf("解析終了\n"); 41 printf("Time = %lf sec\n", (double)(end - begin) / CLOCKS_PER_SEC);/*時間を出力*/ 42 43 return 0; 44}

投稿2021/08/02 13:55

編集2021/08/03 15:30
jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

早すぎて、時間計測の最小単位になってしまってるとかでは。
1万回繰り返すなどして、それで見てみればどうなるでしょう

投稿2021/08/02 09:25

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

st-riefu274

2021/08/02 09:55

早速のご返答ありがとうございます。 文字数を増やして試行を繰り返してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問