シーザー暗号はすべてのアルファベットを\(n\)個ずつずらす暗号です。
ABCDEFGHIJKLMNOPQRSTUVWXYZ ↓(+3) DEFGHIJKLMNOPQRSTUVWXYZABC
暗号を元の文に復号化するときには逆に\(-n\)文字ずらさないといけないのですが、\(13\)文字ずらす場合には暗号化するときも復号化するときも同じく\(13\)文字ずらせばよくて、この場合は特別にROT13という名前で知られています。
Pythonで文字コードを変更するときなどに使うencode、decode関数にはROT13も実装されています。
print 'Hello World'.encode('rot13')
Uryyb Jbeyq
前にエンジニア向けの脱出ゲーム「コードルームからの脱出」に挑戦した時にシーザー暗号をやるのがめんどくさかったのでコードを書きました
string.ascii_uppercaseとstring.ascii_lowercaseにAからZまでのアルファベットが大文字小文字別に含まれているので、それらをずらして使っています。
import string class CaesarCipher(object): @staticmethod def shifted_table(shift): shift %= 26 alphabet = string.ascii_lowercase + string.ascii_uppercase shifted = string.ascii_lowercase[shift:] + string.ascii_lowercase[:shift] + string.ascii_uppercase[shift:] + string.ascii_uppercase[:shift] table = string.maketrans(alphabet, shifted) return table def __init__(self, shift): self.shift = shift self.table_encode = self.shifted_table(shift) self.table_decode = self.shifted_table(-shift) def encode(self, text): return text.translate(self.table_encode) def decode(self, text): return text.translate(self.table_decode) if __name__ == '__main__': caesar = CaesarCipher(16) cipher = caesar.encode('aiueo') text = caesar.decode(cipher) print cipher, text
qykue aiueo