Pythonのbase64モジュールを使ったデータエンコード・デコード入門
PythonにおけるBase64エンコーディングとは
Python標準ライブラリのbase64モジュールは、バイナリデータをプレーンテキスト(ASCII)プロトコルで安全に送信できる形式へ変換するための機能を提供します。メール送信、URLへの埋め込み、HTTP POSTリクエストなど、テキストベースの通信経路でバイナリデータを扱いたい場面で活躍するモジュールです。
このモジュールが実装しているのは、RFC 3548で定義されたBase16、Base32、Base64の各アルゴリズム、および事実上の標準となっているAscii85とBase85のエンコーディングです。RFC 3548準拠のエンコーディングは、バイナリデータを電子メールで安全に送信したり、URLの一部として使用したり、HTTP POSTリクエストに含めたりするのに適しています。
モダンなインターフェースでは、bytesライクなオブジェクトをASCIIバイト列へエンコードし、逆にASCII文字を含むbytesオブジェクトや文字列を元のバイト列へデコードできます。サポートされるアルファベットは、RFC 3548で定義された「標準」「URL安全・ファイルシステム安全」の2種類です。
モダンインターフェース:b64encode()とb64decode()
base64モジュールの現代的なインターフェースには、以下の2つの主要関数があります。
- base64.b64encode(): bytesライクなオブジェクトをBase64でエンコードし、エンコード済みのバイト列を返します。
- base64.b64decode(): Base64でエンコードされたbytesオブジェクトまたはASCII文字列をデコードし、元のバイト列を返します。
文字列をBase64でエンコードする手順
まず、Pythonの文字列をバイトオブジェクトに変換します。encode()メソッドを使用します。
>>> import base64
>>> string = 'Python programming'
>>> enc_string = string.encode()
>>> enc_string
b'Python programming'
次に、このバイトオブジェクトをb64encode()関数でエンコードします。
>>> b64_estring = base64.b64encode(enc_string)
>>> b64_estring
b'UHl0aG9uIHByb2dyYW1taW5n'
decode()メソッドを使えば、バイトオブジェクトから通常の文字列を取り出せます。
>>> dec_string = b64_estring.decode()
>>> dec_string
'UHl0aG9uIHByb2dyYW1taW5n'
Base64文字列をデコードして元に戻す
デコード処理では、まずエンコード済みの文字列を再度バイトオブジェクトに変換します。
>>> b1 = dec_string.encode()
>>> b1
b'UHl0aG9uIHByb2dyYW1taW5n'
続いて、b64decode()関数でデコードを行います。
>>> d = base64.b64decode(b1)
>>> d
b'Python programming'
最後に、得られたバイトオブジェクトをdecode()することで、元の文字列が復元されます。
>>> originalstring = d.decode()
>>> originalstring
'Python programming'
URLセーフなエンコーディング:urlsafe_b64encode()とurlsafe_b64decode()
標準のBase64アルファベットには「+」と「/」が含まれています。これらの記号はURL内で使用すると問題が生じる可能性があるため、URLやファイルパスに組み込む場合は代替文字に置き換える必要があります。
- base64.urlsafe_b64encode(): 標準のBase64アルファベットの「+」を「-」に、「/」を「_」に置き換えた、URL・ファイルシステム安全なアルファベットでエンコードし、結果のバイト列を返します。
- base64.urlsafe_b64decode(): 同じURL・ファイルシステム安全なアルファベットを使用して、bytesオブジェクトまたはASCII文字列をデコードし、元のバイト列を返します。
レガシーインターフェースによるファイルのエンコード・デコード
base64モジュールには、ファイルオブジェクトを直接扱うための従来型インターフェースも用意されています。
- base64.encode(input, output): バイナリ入力ファイルの内容をエンコードし、結果のBase64データを出力ファイルへ書き込みます。inputとoutputはどちらもファイルオブジェクトである必要があり、input.read()が空のbytesオブジェクトを返すまで読み込まれます。
- base64.decode(input, output): バイナリ入力ファイルの内容をデコードし、結果のバイナリデータを出力ファイルへ書き込みます。こちらも引数はファイルオブジェクトで、input.readline()が空のbytesオブジェクトを返すまで読み込まれます。
ファイルを作成してエンコードする例
まず、「wb」(書き込みバイナリ)モードでファイルを作成します。
>>> f1 = open('file.txt','wb')
>>> f1.write('Simple is better than complex'.encode())
>>> f1.close()次に、base64.encode()メソッドを使ってファイルをエンコードします。
>>> f1 = open('file.txt','rb')
>>> f2 = open('file.dat','wb')
>>> base64.encode(f1,f2)
>>> f1.close()
>>> f2.close()生成されたfile.datをテキストエディタで開くと、以下のようなBase64エンコードされた内容が確認できます。
U2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXg=
エンコード済みファイルをデコードする例
file.datをfilenew.txtとして復元するには、base64.decode()関数を使用します。
>>> f1 = open('file.dat','rb')
>>> f2 = open('filenew.txt','wb')
>>> base64.decode(f1,f2)
>>> f1.close()
>>> f2.close()処理後、filenew.txtを開けば、元のテキスト「Simple is better than complex」が正しく復元されていることがわかります。
まとめ
Pythonのbase64モジュールを使えば、文字列やファイルのバイナリデータを簡単にBase64形式へ変換でき、テキストベースのプロトコル経由でも安全にデータをやり取りできます。日常的な用途ではb64encode()/b64decode()、URLでの利用にはurlsafe_b64encode()/urlsafe_b64decode()、ファイル全体の変換にはレガシーなencode()/decode()と、目的に応じて関数を使い分けるのがポイントです。
-
Pythonで画像に秘密のメッセージを隠す方法|Pillowとstepicで学ぶステガノグラフィ入門
ステガノグラフィ(Steganography)とは、情報を目立たない形で隠す技術です。SHA1やMD5などのアルゴリズムでデータを暗号化することに重点を置く暗号技術(Cryptography)とは異なり、ステガノグラフィは、データ(ファイル、画像、メッセージ、動画など)を別のファイルや画像の中に埋め込み、その存在自体に気づかれないようにすることを目的としています。 この記事では、画像の見た目にほとんど変化を与えることなく、画像の中に情報を隠すシンプルなPythonプログラムを作成します。プログラムは大きく分けて2つの部分から構成されます。1つ目は、画像ファイルから秘密情報を取り出すデコード機能
-
Pythonで作るWebサイトブロッカー ― 業務時間中にSNSへのアクセスを自動遮断する方法
大手IT企業で働いたことがある方なら、FacebookやYouTube、InstagramといったSNS系のWebサイトが社内からアクセスできないよう制限されていることに気づいた経験があるかもしれません。こうした制限は、サードパーティ製アプリに頼らなくても実現できます。自分専用のオリジナルツールを作れば、好きなWebサイトを自由にブロックできるのです。しかもPythonでWebサイトブロッカーを開発するのは、それほど難しいことではありません。この記事では、指定したWebサイトをブロックするPythonスクリプトの作り方を解説します。前提条件Python 3.x がインストールされていることPy