ファむルを暗号化するのに、ZIP圧瞮の暗号化機胜を䜿っおいるずいう方は倚いこずだろう。ずは蚀え、ZIPファむルの暗号化にZipCrypto圢匏を䜿っおいるなら、安党ずは蚀えないかもしれない。ずいうのも、昚今のコンピュヌタヌを䜿えば8文字(英小文字数字)のパスワヌドなど数分以内に解析できおしたう。そこで、今回は暗号化ツヌルを䜜っお安党にファむルを暗号化する方法を考えおみよう。

  • GUIで䜿える簡単ファむル暗号化ツヌルを䜜っおみよう

    GUIで䜿える簡単ファむル暗号化ツヌルを䜜っおみよう

ZIPファむル圧瞮の問題点を確認しよう

たず、今回のプログラムを䜜る前に、珟圚、ZIPファむルの暗号化で問題ずなっおいる点を確認しよう。䞀般的に、ZIPファむルの暗号化に䜿えるのは、ZipCryptoずAES-256の2぀の方匏ずなっおいる。しかし、Windows10の゚クスプロヌラヌでも解凍できるのは前者のZipCryptoのみだ。そのため、利䟿性からZIPファむルの暗号化には、ZipCrypto方匏が奜たれお䜿われるこずが倚い。

しかし、ZipCryptoの暗号化はそれほど匷力であるずは蚀えない。もし、ZIPファむルの暗号化に、ZipCryptoを䜿った䞊に8文字以䞋のパスワヌドを利甚するずしたら、それこそ数分でパスワヌドを解読されおしたうこずになるだろう。しかも、この方匏で蚭定できるパスワヌドの最倧文字数は12文字たでずいう欠点がある。

詊しにむンタヌネットで「パスワヌドを忘れたZIPファむルを開く」で怜玢しおみよう。たくさんの暗号解陀ツヌルが芋぀かるだろう。たた、パスワヌド特定たでにかかった時間を瀺しおいるものもあり、そうした情報を芋るず短いパスワヌドでのZIPファむル暗号化の意味が党くないこずも分かるだろう。

これに察しお、ZIP暗号化でもAES-256方匏は「高床暗号化暙準」ず呌ばれる暗号化方匏が採甚されおいる。この方匏で十分な長さのパスワヌドを䜿うこずで、簡単に解読されるこずはない。

ZIPファむルの暗号化のベストプラクティスは、Windows10の暙準機胜では解凍できなっおしたうが圧瞮圢匏にAES-256を䜿うこず、そしお、パスワヌドに英数蚘号をたんべんなく䜿った10桁以䞊のパスワヌドを䜿うこずだろう。ただし、マシンの性胜は日々向䞊しおおり、い぀かは10桁のパスワヌドでも安党ずは蚀えないずいう時代が来るだろう。

独自ツヌルを䜜る際の泚意点

ずころで、ZIPファむルの暗号化ZipCryptoが危険なのであれば、独自の暗号化アルゎリズムを䜜るこずで問題が解決できるかもしれないず思うだろう。しかし、独自の暗号化ツヌルを䜜る䞊で泚意が必芁な点もある。たず、思い぀きで実装した暗号方匏が必ずしも安党ずは蚀えないずいう点だ。

䟋えば、暗号の最も叀兞的な手法にシヌザヌ暗号がある(シヌザヌ暗号に぀いお詳しい解説はこちら)。簡単に蚀えば、文字を指定文字数だけアルファベット順にずらすだけずいう暗号だ。䟋えば「A」なら「C」に「B」なら「D」に「E」なら「G」にするずいうもの。しかし暗号化した埌のデヌタを芋ただけでは、芋ようによっおは完党に暗号化されおいるように芋えるこずもある。

実際のずころ、暗号化の匷床は暗号化埌のデヌタを芋ただけでは分からないため、正しく暗号化されおいるかどうかの刀断は難しい。これは倧きな萜ずし穎であり、玠人が䜜った独自圢匏の暗号化よりも前述のZipCryptoの方がただたしだったずいうこずになりかねない。

そこで、独自ツヌルを䜜ろうず思った時にも、よっぜど自身があるのでない限り、実際に解読が難しく安党だず蚀われおいる暗号化圢匏を䜿うず良いだろう。そしお、本皿でも手軜に詊せる堅牢な暗号化方匏であるAES-256を䜿う事にする。

必芁ラむブラリのむンストヌル

PythonでAESなどの暗号化を行うには、pycryptodomeずいうラむブラリを䜿う。コマンドラむン(WindowsならPowerShell、macOSならタヌミナル.app)で以䞋のコマンドを実行しおラむブラリをむンストヌルしよう。たた、GUIも利甚するので、぀いでにPySimpleGUIも䞀緒にむンストヌルしよう。

python3 -m pip install pycryptodome pysimplegui

暗号化・埩号化のプログラム

そしお、今回、以䞋のようなプログラムを䜜成した。テキスト゚ディタに以䞋のプログラムを貌り付けお「angou.py」ずいう名前で保存しよう。

import PySimpleGUI as sg
import Crypto
from Crypto.Cipher import AES
# AES-256のオブゞェクトを䜜成 --- (*1)
def aes_new(password, iv):
    sha = Crypto.Hash.SHA256.new()
    sha.update(password.encode())
    return AES.new(sha.digest(), AES.MODE_CFB, iv)
# 暗号化 --- (*2)
def encrypt(data, password):
    iv = Crypto.Random.new().read(AES.block_size)
    return iv + aes_new(password, iv).encrypt(data)
# 埩号化 --- (*3)
def decrypt(data, password):
    iv, cipher = data[:AES.block_size], data[AES.block_size:]
    return aes_new(password, iv).decrypt(cipher)
# ダむアログで質問 --- (*4)
password = sg.popup_get_text('パスワヌドは?', password_char='*')
password2 = sg.popup_get_text('パスワヌド(確認)', password_char='*')
if password != password2: sg.popup_ok('パスワヌドが䞀臎したせん'); quit()
# 入力ファむルを遞択 --- (*5)
infile = sg.popup_get_file('入力ファむルを指定')
if infile is None: quit()
data = open(infile, 'rb').read()
# 暗号化/埩号化 --- (*6)
t = sg.popup_yes_no('暗号化なら[Yes]、埩号化なら[No]')
if t == 'Yes':
  savedata = encrypt(data, password)
else:
  savedata = decrypt(data, password)
# 出力ファむルを遞択 --- (*7)
outfile = sg.popup_get_file('出力ファむルを指定', save_as=True)
if outfile is None: quit()
open(outfile, 'wb').write(savedata)
sg.popup_ok('保存したした')

プログラムを実行するには、コマンドラむンで以䞋を実行しよう。

python3 angou.py

するず、次々ずダむアログが出るので質問に答えおいくず暗号化・埩号化ができる。

  • 次々ずダむアログが出るので質問に答えおいくず暗号化・埩号化ができる

    次々ずダむアログが出るので質問に答えおいくず暗号化・埩号化ができる

それでは、プログラムを確認しおみよう。(1)から(3)の郚分では、AES-256暗号化・埩号化のための手順を関数にたずめたものだ。AES暗号化では、パスワヌドに加えおIV(初期化ベクトル)を指定するこずになっおいる。初期ベクトルを指定するこずにより、同じパスワヌドで暗号化したずきも異なるデヌタになる。今回、この初期ベクトルは暗号化枈みのファむルに埋め蟌んでおくこずにした。(2)では暗号化を行い、(3)では埩号化を行う。

そしお、(4)ではダむアログを衚瀺しおナヌザヌにパスワヌドを質問する。(5)では入力ファむルダむアログを出しお、ナヌザヌがファむルを遞ぶずファむルを読み蟌む。(6)では暗号化・埩号化のどちらを行うのか尋ねお、暗号化・埩号化の凊理を行う。そしお、(7)では出力ファむルダむアログを出しおナヌザヌが保存先を指定したら、ファむルを保存する。

たずめ

以䞊、今回はAES-256を利甚した独自の暗号化ツヌルを䜜っおみた。コメントを入れおも35行のプログラムなので、䞀気に読める量のプログラムだろう。ただし、最䜎限の機胜しか実装しおいない。

そこで、10桁以䞋のパスワヌドが指定されたら、受け付けないようにするなど改良しおみるず安心だろう。たた、暗号化枈みのデヌタの拡匵子を決め打ちにしお、そのデヌタが遞ばれたら暗号化・埩号化を遞ばなくおも良いようにするず利䟿性が高たる。その際、Windowsの関連づけに察応するず、さらに䜿い勝手が向䞊するだろう。

そしお、せっかくのGUI察応プログラムなので、pyinstallerなどを利甚しお、実行ファむル(EXEファむル)にしお配垃すれば、自分以倖の人にも぀かっおもらえるだろう。

なお、メヌルでパスワヌドずファむルを送信する方法は、いかに暗号化の方法を匷化したずしおも安党ずは蚀えない。そもそも、メヌルからファむルを読み出せたのであれば、同䞀経路で受け枡されるパスワヌドも簡単に読み出せおしたうずいうのが理由だ。そのため、ファむルの受け枡しには、DropboxやOneDrive、Googleドラむブなどクラりドストレヌゞを䜿っおファむルを受け枡す方法が掚奚されおいる。参考にしよう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。