Hatena::ブログ(Diary)

ぼくらのトークン戦争

2011-05-25 可逆暗号をたった1行で書く方法

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


f:id:a1102012:20110526081922p:image

はじめに

ソフト作ってるとき、「データ丸見えじゃなくてちょっと隠したいなー」ってときはありませんか?
そんなときにおススメな 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行で気軽に可逆暗号しましょう!
(復号化した値は私の会社のメールです。気軽にメールしてくださいね)

よろしければこちらの記事もどうぞ

 
 

takahirotakahiro 2011/05/28 01:16 実はstr.encode("rot_13")はpython3で使えないんですよね。
自分で書く必要があります。

import io
def rot13(s):
"""Encrypt the string `s' by rot13 algorithm. """
with io.StringIO() as new_str:
for c in s:
c = ord(c)
if (97 <= c < 109) or (65 <= c < 77):
c += 13
elif (109 <= c <= 122) or (77 <= c <= 90):
c -= 13
new_str.write(chr(c))
return new_str.getvalue()

a1102012a1102012 2011/05/28 15:37 takahiroさん、こんにちは。
コードありがとうございます(゜ー゜)

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証