Pythonでcryptographyを使用しファイルを暗号化及び復号化する

Pythonでcryptographyを使用しファイルを暗号化及び復号化してみます。

なお、今回はcryptographyモジュールを使用します。cryptographyモジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■ファイルを暗号化する

では、まずcryptographyを使用しファイルを暗号化するスクリプトを書いていきます。

■コード

from cryptography.fernet import Fernet

#キーを作成する
key = Fernet.generate_key()

#キーをローカルに保存する
with open(r"C:\Users\user\test\test_key.key","wb") as key_data:
    key_data.write(key)

#暗号化するファイルの取得
with open(r"C:\Users\user\test\test.txt","r") as file:
    data = file.read()

print("暗号化する前: ",data)

#データをバイトに変換する
byte_data = data.encode()

#Fernetオブジェクトの初期化
f = Fernet(key)

#バイトデータを暗号化する
encrypt_data = f.encrypt(byte_data)

#暗号化した情報をファイルに書き込む
with open(r"C:\Users\user\test\test.txt","wb") as file:
    file.write(encrypt_data)

print("暗号化した後: ", encrypt_data)

ファイルを暗号化する場合は、cryptography.fernetを呼び出します。

その後、keyという変数を作成し、Fernet.generate_key()で新しくfernetキーを作成し格納します。これを紛失すると、ファイルを復号化できなくなります。

格納後、with構文を使用し、キーをローカルに保存します。wb(バイナリファイルにデータを書き込む)モードで、今回は「C:\Users\user\test\(フォルダパス)」にtest_key.keyという名前でキーを保存します。

次に、with構文を使用し、暗号化するファイルの取得します。今回は「C:\Users\user\test\(フォルダパス)」内に「test.txt」というファイルをあらかじめ作成しておきましたので、これをr(ファイルを読み込む)モードでファイルを取得します。

今回上記のような個人情報を含むテキストファイルを作成しています。

取得したファイルの情報を、dataという変数に格納します。

その後、byte_dataという変数を作成し、取得したファイルの情報をencode()でエンコーダ(バイト化)し、エンコーダしたものを格納します。

格納後、fという変数を作成し、Fernet()で、Fernetオブジェクトを初期化し格納します。

Fernetオブジェクトを初期化した後に、encrypt_dataという変数を作成し、その中でf.encrypt()を使用し、バイト化したファイルの情報を、暗号化します。暗号化後、格納。

格納後、with構文を使用し、暗号化した情報を、ファイルに書き込みます。wb(バイナリファイルにデータを書き込む)モードで、暗号化した情報を「C:\Users\user\test\(フォルダパス)」内のtest.txtに書き込みます。

■実行

このスクリプトを「encrypt_file.py」という名前で保存し、コマンドプロンプトから実行してみます。

実行してみると、今回指定したテキストファイルが暗号化され出力されました。テキストファイルの中身を確認しましたが、暗号化された情報が書き込まれていることが確認できました。

■ファイルを復号化する

では、次に暗号化したファイルを復号化するスクリプトを書いていきます。

■コード

from cryptography.fernet import Fernet

#キーの読み込み
with open(r"C:\Users\user\test\test_key.key","rb") as test_key:
    key = test_key.read()
#暗号化したファイルの読み込み
with open(r"C:\Users\user\test\test.txt","rb") as file:
    encryp_data = file.read()

print("暗号化された情報: ",encryp_data)

#キーを使ってFernetオブジェクトを初期化
f = Fernet(key)
#データの復号化
decrypt_data = f.decrypt(encryp_data)

print("復号化した情報: ",decrypt_data.decode('utf-8'))

ファイルを暗号化する場合は、cryptography.fernetを呼び出します。

その後に、with構文を使用し、暗号化した際に生成されたfernetキーの読み込みを行います。wb(バイナリファイルを読み込む)モードで、「C:\Users\user\test\(フォルダパス)」内のtest_key.keyを読み込みます。読み込んだ後、keyという変数に、読み込んだ情報を格納します。

読み込んだ後、今度はwith構文を使用し、暗号化したファイルの読み込みを行います。wb(バイナリファイルを読み込む)モードで、「C:\Users\user\test\(フォルダパス)」内のtest.txtを読み込みます。読み込んだ後、encryp_dataという変数に、読み込んだ情報を格納します。

格納後、fという変数を作成し、キーを使ってFernetオブジェクトを初期化し、格納します。

その後、decrypt_dataという変数を作成し、f.decrypt()を使用し、暗号化したファイルを復号化します。復号化後、格納します。

最後に、復号化したファイルをprint関数で出力しますが、復号化したファイルがbytes(バイト)型,バイナリー文字列となっていますので、bytes(バイト)型から文字列への変換(デコード)を行うため、「decode(‘utf-8’)」と記述し、変換して出力します。

■実行

このスクリプトを「decrypting_file.py」というファイルで保存し、コマンドプロンプトから実行してみます。

実行してみると、今回暗号化したファイルを復号化し出力させることができました。

なお、このスクリプトは、暗号化した際に生成されたfernetキーと、暗号化したファイルの情報を読み取り、復号化しただけですので、暗号化されたファイルは、「C:\Users\user\test\(フォルダパス)」内に保存されています。

コメント

タイトルとURLをコピーしました