株も歩けば犬に当たる

ブラックSlerで働くSEが株やPythonや思ったことについて書いています。

ROT13をPythonで実装してみる

ROT13って何?

ROT13 または ROT-13、rot13 は単換字式暗号(シーザー暗号)の一つである。アルファベットを一文字毎に13文字後のアルファベットに置き換える。Aは Nに、 B は O に置き換えられ、以下同様である。英語の "Rotate by 13 places" の略。ネットワーク上のやりとり(電子掲示板、ネットニューズ、フォーラム等)で冗談の落ち、パズルの解法、ネタばれ情報、不快表現等を隠すのに用いられるアルゴリズムである。実際には暗号というほどのものではないが、ちょっと見に読んでしまうという事態は避けられる。雑誌などでクイズの正解を上下逆さまに印刷するが、それと似たようなものである。

ROT13 - Wikipedia

実装手順

この文字はROT13で暗号化された文字です。

pboby vf sbffvy.

文字にそのまま13は足せないので、一度この文字列をASCIIの数値に変換します。

以下、ASCIIコードの数値と文字の対応表のURL。

文字と数値 | サルにも分かるRSA暗号

112 98 111 98 121 32 118 102 32 115 98 102 102 118 121 46

ASCIIの数値に変換するとこうなります。


文字コードに変換してから、13を足すか引くかの条件を分岐するので、ASCIIの文字コードに変換した時

  • 65〜77であれば、プラス13
  • 78〜90であれば、マイナス13
  • 97〜109であれば、プラス13
  • 110〜123であれば、マイナス13

これで、A〜Z、a〜zの対応付けすることができます。


以下、簡単な対応表です。

A - M 65 - 77
N - Z 78 - 90
a - m 97 - 109
n - z 110 - 123

実装してみる

contents = "pboby vf sbffvy."
process = ""
for script in contents:
	num = ord(script)

	#space or period
	if num == 32 or num == 46:
		ascii_script = chr(num)

	#A - M
	elif num >= 65 and num <= 77:
		ascii_script = chr(num + 13)

	#N - Z
	elif num >= 78 and num <= 90:
		ascii_script = chr(num - 13)

	#a - m
	elif num >= 97 and num <= 109:
		ascii_script = chr(num + 13)

	#n - z
	elif num >= 110 and num <= 123:
		ascii_script = chr(num - 13)

	process += ascii_script

print(process)

このプログラムをじっこうした結果

cobol is fossil.

こうなります。

まとめ

最近は新人研修に勤しむ毎日です。

しかも、なななんとcobolの研修なので楽しくて楽しくてたまりません汗

以上終わり。