Pythonでデータを暗号化・復号化する方法!cryptographyライブラリの使い方を徹底解説
はじめに
暗号技術(クリプトグラフィー)とは何でしょうか?暗号技術とは、平文(プレーンテキスト)を暗号文(サイファーテキスト)に変換することを「暗号化」と呼び、逆に暗号文を平文に戻すことを「復号化」と呼びます。
本記事では、Pythonの cryptography パッケージに含まれる Fernet モジュールを使用して、データの暗号化と復号化を行う方法を解説します。Fernetモジュールを使用すると、一意の鍵(キー)が生成され、この鍵がなければ暗号化されたデータを読み取ったり操作したりすることはできません。
それでは、さっそく始めていきましょう。
準備:cryptographyパッケージのインストール
cryptographyモジュールはPythonに標準で同梱されていないため、pipパッケージマネージャーを使ってインストールする必要があります。ターミナル(コマンドプロンプト)を起動し、以下のコマンドを実行してください。
pip install cryptography
パッケージのダウンロードとインストールが完了したら、モジュールをインポートできるようになります。
今回はデータの暗号化と復号化にFernetモジュールを使用します。Pythonスクリプトに以下のようにインポートしましょう。
from cryptography.fernet import Fernet
注意: 大文字・小文字の表記を正確に入力するようにしてください。
これでスクリプトを書き始める準備が整いました。
鍵の生成
データの暗号化を開始するには、まず Fernetキー を作成する必要があります。
key = Fernet.generate_key() f = Fernet(key)
上記のコードでは、まず generate_key() メソッドで鍵を生成し、次の行でその鍵を変数 f に代入しています。
これだけで、使用可能な鍵が変数に格納されました。
必要に応じて、鍵を印刷して保存しておくこともできます。その際は decode() 関数を使用してください。
print(key.decode())
実行結果
Bq64GE--93K1RVro4go1frN-8twBSvXdbCPSPLIKz9U=
データの暗号化
生成した鍵を使ってデータを暗号化するには、encrypt メソッドを使用します。
encrypted_data = f.encrypt(b"This message is being encrypted and cannot be seen!")
これだけで、上記の文章が暗号化されました。
暗号化されたメッセージを確認するには、print文で出力します。
print(encrypted_data)
実行結果
b'gAAAAABgILy91p_wqMntdT3mDkh0IBXSLjuBMQAfnGZAFkZCX1U6Q7TU2PthgFBwVz0QbKXpuNTHRzAgbdDV4zfuuzkGCXqVD--xJdkTycKH2iurC_oqHySLc9xJEXz93LkhTbKUa5HCxfJtB-Um_YkxqjclftXXZQ=='
注意: 文の先頭に b を付けているのは、文字列をバイト形式に変換するためです。代わりに encode() メソッドを使用することも可能です。
データの復号化
次に、暗号文を元の読める平文に戻す方法を見ていきましょう。
復号化には、Fernetモジュールの decrypt メソッドを使用します。
decrypted_data = f.decrypt(encrypted_data) # f は鍵の値が格納された変数 print(decrypted_data)
実行結果
b'This message is being encrypted and cannot be seen!'
注意: 上記の出力を見ると、平文の前に b' が付いています。これは、復号化されたデータがバイト形式で返されるためです。平文だけを取得したい場合は、decode() 関数を使用します。
print(decrypted_data.decode())
実行結果
This message is being encrypted and cannot be seen!
補足: 同じ鍵を使い回して暗号化・復号化を行うこともできます。鍵の値を印刷して保存しておけば、その値を変数に代入することで同じ鍵を再利用できます。例は以下の通りです。
f = Fernet(Bq64GE--93K1RVro4go1frN-8twBSvXdbCPSPLIKz9U=) # 実際の鍵の値を指定
サンプルコード全体
ここまでの流れを、1つのスクリプトにまとめた完全なサンプルコードを紹介します。
from cryptography.fernet import Fernet
key = Fernet.generate_key()
print("Key : ", key.decode())
f = Fernet(key)
encrypted_data = f.encrypt(b"This message is being encrypted and cannot be seen!")
print("After encryption : ", encrypted_data)
decrypted_data = f.decrypt(encrypted_data)
print(decrypted_data)
print("After decryption : ", decrypted_data.decode())実行結果
Key : u4dM7xw8sNNU3Rm_lwDbixudWSeaM0Z4TTDdQNKsouI= After encryption : b'gAAAAABgIL3_qbfM_oMgQn653gpk6a7hqxXiR0dl0vrmOmqnr5b6MqrsjGkK1IknxMLLtOCq6_YlX4x3nBedbZqtCqy4os55pttrl-pBO6-dJf6kVP50IpIaKSXbpAsuWl4h_2o_E-4YEqZ5kkgxWrwnqojmkMyuSQ==' b'This message is being encrypted and cannot be seen!' After decryption : This message is being encrypted and cannot be seen!
まとめ
本記事では、Pythonのcryptographyパッケージを使ってデータを暗号化・復号化する方法を学びました。
生成した鍵を .txt ファイルとして保存し、後から読み込んでパスワードの暗号化・保存や、データベースから取り出したパスワードの照合などに活用することもできます。小規模なミニプロジェクトから大規模なシステムまで、さまざまな場面で応用できる便利な技術です。
cryptographyモジュールの詳細については、公式ドキュメント(https://pypi.org/project/cryptography/)を参照してください。
-
Pythonによるデータ分析と可視化入門|pandasの基本を徹底解説
Pythonによるデータ分析と可視化の概要 Pythonには、データ分析と可視化のための強力なライブラリが数多く用意されています。代表的なものとしては、NumPy、pandas、matplotlib、seabornなどが挙げられます。本記事では、その中でも中心的な役割を果たすpandasについて詳しく解説します。pandasはNumPyをベースに構築されたオープンソースライブラリで、高速なデータ分析やデータのクリーニング・前処理を効率的に行えます。さらに、pandas自体にも便利な可視化機能が組み込まれています。 pandasのインストール方法 pandasをインストールするには、ターミナル
-
Androidスマホでファイルを暗号化・復号化する完全ガイド
Androidデバイスでファイルを暗号化しておけば、万が一端末やデータが盗まれたとしても、正しい鍵で復号化されない限り中身を読み取られることはありません。暗号化とは、ファイルの中身を意味のわからない文字列に変換する仕組みで、一般的にはAES 128またはAES 256という強力な規格が使われています。この規格で暗号化された情報は、事実上解読不可能とされています。 この記事では、Androidデバイスでファイルを暗号化する方法を、端末全体を暗号化する場合と特定のファイルだけを暗号化する場合の2つのパターンに分けて、手順を詳しく解説します。 Android端末全体を暗号化する方法 最も包括的な