[Python] シーザー暗号化

前回、JavascriptとPHPで生合成の取れたシーザー暗号化プログラムを作りましたが、サーバーサイドでPython版も作っておきました。
データをシーザー暗号化でまあまあセキュアな通信を行えるJSとPHPの互換コードを作ったよ
シーザー暗号化については、前回の記事を読んで理解してもらえると思うんですが、サーバーサイドプログラムにおいてPythonが有効である理由を見つけました。
サーバーサイドプログラムでPythonが有効な理由について
最新のOSでは、Windowsを除く、MacOSやLinuxなどにおいて、デフォルトでPythonがインストールされています。
余談ですが、Windowsは本当に残念なOSなので仕方がないのですが、こうした世の中の主流に乗れないでいるので、どうしても下火になりつつありますよね・・・
LinuxやUnixをWEBサーバーにするケースは少なく無く、そうしたOSでshellやbash、awkと言った、古くから存在するスクリプトコードは、ターミナルでも、プログラム化しても、非常に便利に使えるのですが、どれも、複雑なシステムを作るのには向いていません。
それに、今時ではAIに強いPythonがデフォルトで加わったというのであれば、それを活用しない手はないでしょう。
シーザー暗号化コード(python2系版)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# coding:utf-8 import urllib class Caesar: def encode(self , val , key): strs = urllib.quote(val.encode('utf-8')) result = "" for i in range(len(strs)): result += chr(ord(strs[i]) + key) return result def decode(self , val , key): result = "" for i in range(len(val)): result += chr(ord(val[i]) - key) return urllib.unquote(result) # test str = u"あいうえおabcdefg" caesar = Caesar() enc = caesar.encode(str , 3) print(enc) dec = caesar.decode(enc , 3) print(dec) |
シーザー暗号化コード(python3系版)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# coding:utf-8 import urllib.request class Caesar: def encode(self , val , key): strs = urllib.request.quote(val.encode('utf-8')) result = "" for i in range(len(strs)): result += chr(ord(strs[i]) + key) return result def decode(self , val , key): result = "" for i in range(len(val)): result += chr(ord(val[i]) - key) return urllib.request.unquote(result) # test str = u"あいうえおabcdefg" caesar = Caesar() enc = caesar.encode(str , 3) print(enc) dec = caesar.decode(enc , 3) print(dec) |
簡単解説
コメントの#test以降は除外してライブラリとしてお使いくださいませ。
Pythonのクラス記述があまり慣れていなかったので、self引数をつけずに、受け渡し個数が合わないエラーに悩まされていましたが、Pythonにおいて、class内の受け値で必ずselfを付けるというお作法を初めて知りました。(お恥ずかしい話ですが・・・)
ソースコード自体は意外とシンプル構成で、下記の手順で行なっている。
1. 文字列をurl文字エンコードにするのは、全角と記号に対応する為
2. url文字エンコードされた文字列を一文字ずつ、キャラクターコードを取得し、それに任意のkey値を足し込んで行く
3. 足し込んだ数値をキャラクタ変換すればエンコードが完了
4. デコードは、一文字ずつのキャラコードからエンコードしたkey値を引いてあげる。
5. それをキャラクタ表示
6. 最後に、url文字デコードすれば、復元完了
全部一緒に解説したが、読める人は、簡単に理解できると思います。
全てが半角英数字であれば、費やすデータ容量(バイト数)は変わらないのですが、全角などが入ると、2〜3倍ぐらいに膨らむので、ここから圧縮をかけるかどうかはご判断ください。
ちなみに、v2とv3の違いは、「urllib」を「urllib.request」に変更するだけでした。
余談
ちなみに、今回PHPプログラムから、関数のローカライズを行なってみましたが、PHPからPythonに対応できる、関数変換ページを見つけたので、ここがかなり便利にできていたため、ご紹介します。