前回、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 >>
0 件のコメント:
コメントを投稿