[Python] シーザー暗号化

2018年5月12日

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系版)

# 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系版)

# 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に対応できる、関数変換ページを見つけたので、ここがかなり便利にできていたため、ご紹介します。 PHP >>

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。