読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Pythonでシーザー暗号

シーザー暗号はすべてのアルファベットを\(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
-->