Pythonと情報セキュリティ

Pythonは情報セキュリティの世界でよく使われる言語でもあります。 いろいろな計算を行うライブラリが標準、外部ライブラリともにそろっていたり、Pythonのインタプリタの使い勝手がよかったり、手軽に書きやすいなどの理由から愛用している人も多いようです。 TBS系で放送されたブラッディ・マンデイというドラマで主人公の凄腕ハッカーがPythonを使っていたことが(一部で)話題になっていたこともありました。

そんなPythonの暗号化/復号化するためのライブラリ「pycrypto」を紹介します。

pycryptoのつかいかた

まずはpipでinstallを行います。

$ pip install pycrypto

(Mac python3系)

$ pip3 install pycrypto

pipでinstallコマンドをコマンドプロンプト、ターミナルに入力すると、以下の様なテキストが表示され、無事にインストールが完了するはずです。

Collecting pycrypto
  Downloading pycrypto-2.6.1.tar.gz (446kB)
    100% |████████████████████████████████| 446kB 1.1MB/s
Installing collected packages: pycrypto
  Running setup.py install for pycrypto
Successfully installed pycrypto-2.6.1

5行目でRunning setup.pyが実行されて、インストールした後にPythonで使うためのセットアップが自動的に行われていることが分かります。

それでは早速使ってみます。pycryptoは、Cryptoという名前でimportできます。その中で今回は「AES」という有名な暗号規格をつかって、暗号化と復号化を試してみます。

>>> from Crypto.Cipher import AES
>>>
>>> secret_key = 'this is secret:)'
>>> message = 'Awesome python!!'
>>>
>>> crypto = AES.new(secret_key)
>>>
>>> cipher_data = crypto.encrypt(message)
>>> print(cipher_data)
b'\x9b\xe6p\xdc-\x7fBgDR\xc0\xa1aTf\xc0'
>>>
>>> original_message = crypto.decrypt(cipher_data)
>>> print(original_message)
b'Awesome python!!'

今回はAESのモジュールを使いたいので、1行目でCryptoモジュールのCipherの中からAESをimportしました。3行目のsecret_keyは、暗号化のために使う鍵です。4行目は、今回暗号化するメッセージです。5行目でcryptoオブジェクトをsecret_keyを使って、作成します。 7行目で、encryptを使って、messageを暗号化して、cipher_dataに代入してprintで表示してみました。そして、最後に暗号化されたものをもとに戻せることを確認するために、そのcipher_dataを使って、元のメッセージを暗号化されたメッセージを復号化し、表示すると、「Awesome python!!」が表示されました。

注意ポイント

secret_keyは、半角16,24,32のうちのいずれかの長さにしなくてはなりません。また、messageは半角16文字の倍数の長さでなくてはなりません。暗号化したいメッセージに空白を後ろに足すなどして長さを16の倍数に合わせましょう。 それぞれのルールが合わなかった場合、次のようなエラーが表示されます。

  • secret_keyの長さについて ValueError: AES key must be either 16, 24, or 32 bytes long
  • messegeの長さについて ValueError: Input strings must be a multiple of 16 in length