可逆暗号をたった1行で書く方法


はじめに

ソフト作ってるとき、「データ丸見えじゃなくてちょっと隠したいなー」ってときはありませんか?
そんなときにおススメな ROT13 っていう方法があります。

ROT13 または ROT-13、rot13 は単換字式暗号(シーザー暗号)の一つである。
アルファベットを一文字毎に13文字後のアルファベットに置き換える。
Aは Nに、 B は O に置き換えられ、以下同様である。

すごい単純な仕組みだけど、これを使えば簡単に可逆暗号することができます。

可逆暗号やってみよう!

さてここからが本題です。
実はPythonには可逆暗号のrot13のencodeとdecodeが用意されています。

# 元の文字列
str = u'xxxxxxxxxxxxxxx'

# 暗号化します。
# rot13 でエンコード出来るように base64 エンコードしています。
encrypted = str.encode('utf8').encode('base64_codec').encode('rot_13')

>>> print encrypted

# これが暗号化された文字列です。
nKEiDTSmnUI0o2gyov5dpN==

# 元に戻すときは逆順でデコードします。
decrypted = encrypted.decode('rot_13').decode('base64_codec').decode('utf8')

>>> print decrypted
(元の文字列)

こんな風に使います。
rot13で変換できる文字がASCII文字に限られているので、一旦base64エンコードするところがポイントです。
インターネットでデータをやり取りするとき、こうやってちょっと暗号かけてあげると(少し)安心ですね。

おまけ

PHPだと以下みたいに書きます。

function rot13encrypt ($str) {
    return str_rot13(base64_encode($str));
}

function rot13decrypt ($str) {
    return base64_decode(str_rot13($str));
}

$string = '中國是我的家';
$encrypted = rot13encrypt($string); // produces 5Yvg5MlY5cvi5bvE55dR5n62
$decrypted = rot13decrypt($encrypted); // produces 中國是我的家

まとめ

1行で気軽に可逆暗号しましょう!
(復号化した値は私の会社のメールです。気軽にメールしてくださいね)