ITが生活必需品となった現在、私たちは様々なパスワードに囲まれて生活しています。
キャッシュカードの暗証番号やメールアドレスのパスワード、Amazonプライムなど、様々なサービスにログインする際にパスワードを活用しています。
しかし、キャッシュカードの暗所番号の様に、未だに四桁の数字だけを設定しているサービスは多くあります。
今回はこの【四桁の数字のパスワード】が如何に簡単に解読出来るのか❓
を考察します。
まず、簡単な算数でパスワードの組み合わせが何種類存在するのか計算してみます。
【四桁の数字のみの場合】
パスワードに設定できる数字は【0,1,2,3,4,5,6,7,8,9】の10種類です。
一桁目は【0~9】までのどれか。
二桁目も【0~9】までのどれか。
三桁目、四桁目も同様です。
つまり、
10 × 10 × 10 × 10 = 10^4(10の四乗)= 10,000
10,000種類のパスワードが生成できます。
『一万種類もあるのだから、四桁の数字のパスワードでも結構堅牢性が高いのでは?』
と考えてしまうかもしれませんが、コンピューターはこういった単純な作業(数字当てゲーム)が大得意です。
人間と違い、ひたすら解読するまで総当たりで組み合わせをぶつける、といったことが容易なのです。
今回の例では、PDFファイルに設定された四桁の数字のパスワードを解読します。
使用するPDFファイルはこちら。ハーゲンダッツ🍨の成分表です。

energy_sp
.pdf
Download PDF • 94KB
このファイルをZIPファイルへ圧縮し、『8497』というパスワードを設定します。
その後、pythonで総当たり攻撃を行い、パスワードを解読します👇。
実行結果は3~4秒ほどでした。

一瞬でパスワードを解読することが出来ました。
もう一度やってみます。数秒のGIFに収めることができました👇。

今回は13,620回かかりました。しかし、それでもほんの数秒です。
一万通りのパスワードが如何に容易に破れるかが分かりますね。
当たり前ですが、8497のパスワードでファイルが開けました👇。

因みに、試したパスワードはデータフレームに格納しているので以下の様に確認することが出来ます。
ここでのコードはパスワードを解読するのに、重複を許しているので、同じパスワードを何回か使用していることが分かります。

この様に、コンピューターは単純作業が大得意です。
パスワードを設定する際には、他人に推測されにくい様、文字や数字を混ぜ、文字数の多いパスワードを設定するようにした方が良さそうです。
それでは、良きITライフを。
import zipfile
import pandas as pd
import string,random
file_path = 'ここに、解読したいPDFファイルのプルパスを入れてください'
size = 4
chars = '0123456789'
count = 0
numbers = []
with zipfile.ZipFile(file_path , 'r') as zf:
for i in range(100000):
# パスワードはバイト型で有る必要がある。random.choicesは重複あり。
pwd = bytes(''.join(random.choices(chars,k=size)),'UTF-8')
#print(pwd)
numbers.append(pwd) #numbersというリストに一つずつ追加
try:
zf.extractall(path='.', pwd=pwd) #extractallで解凍
print('このPDFファイルのパスワードは、 {}です'.format(pwd))
break
except Exception as e:
count += 1
print('総当たり攻撃で解凍を試した回数は: ' , count ,"回です")
df = pd.DataFrame(numbers)
print("重複したパスワードのデータフレームは以下です。", df[df.duplicated()])
print(df.duplicated().sum(), "種類、同じパスワードを使用しました。")
今回の記事は乙py先生のプログラミング教室 さんのサイトを参考にしました。
大変参考になりました。ありがとうございました。