じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

文字ずら・して探す

概要

シーザー暗号は好きですか??僕は嫌いです。シーザー暗号とは単一換字式暗号の一種で、平文の各文字を、辞書順にn文字シフトして暗号文を作る暗号のことですが僕は超人でもなく、残念ながら平均的な知能しか持たないので、ずらされた文字を見ても、何文字変換されているのか一切、わかりません。何文字変換されているか表示するなのでスクリプトを書きました。

ちなROT13

ROT13というのは13文字ずらすシーザー暗号のことでpythonにも組み込まれています。

import codes

codecs.decode('hello world','rot13')
'uryyb jbeyq'

codecs.encode('uryyb jbeyq','rot13')
 'hello world'

毎回、ROT13とは限りませんし世の中はそんなに甘くない!!!シーザー暗号がROT13だけならどれだけ幸せか…。何文字づらしているか分からない時の為のスクリプトを書きました。

実装

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


class CaesarCipher(object):

    def shift_text(self,c,shift):        
        if 'A' <= c and c <= 'Z':
            return chr((ord(c) - ord('A') + int(shift)) % 26 + ord('A'))
        if 'a' <= c and c <= 'z':
            return chr((ord(c) - ord('a') + int(shift)) % 26 + ord('a'))
    
        return c
    
    def encode(self,text,shift):
        g = [self.shift_text(c,shift) for c in list(text)]
        return ''.join(g)

    def decode(self,text,shift):
        g = [self.shift_text(c,-shift) for c in list(text)]
        return ''.join(g)

    def search(self,text):
        serch_list =[]            
        for count in range(23):
            g = [self.shift_text(c,count) for c in list(text)]
            new_caer = str(count) + ":" + ''.join(g)
            serch_list.append(new_caer)
            #serch_list.append(''.join(g))
        return serch_list

if __name__ == '__main__':
    caesar = CaesarCipher()
    s = "Uryyb, Jbeyq!"    
    cipher = caesar.encode(s,13)
    text = caesar.decode(s,26)
    ser = caesar.search(s)
    print(cipher)
    print(text)
    print(ser)

出力

$python3 Caesar.py
Hello, World!
Uryyb, Jbeyq!
['0:Uryyb, Jbeyq!', '1:Vszzc, Kcfzr!', '2:Wtaad, Ldgas!', '3:Xubbe, Mehbt!', '4:Yvccf, Nficu!', '5:Zwddg, Ogjdv!', '6:Axeeh, Phkew!', '7:Byffi, Qilfx!', '8:Czggj, Rjmgy!', '9:Dahhk, Sknhz!', '10:Ebiil, Tloia!', '11:Fcjjm, Umpjb!', '12:Gdkkn, Vnqkc!', '13:Hello, World!', '14:Ifmmp, Xpsme!', '15:Jgnnq, Yqtnf!', '16:Khoor, Zruog!', '17:Lipps, Asvph!', '18:Mjqqt, Btwqi!', '19:Nkrru, Cuxrj!', '20:Olssv, Dvysk!', '21:Pmttw, Ewztl!', '22:Qnuux, Fxaum!']

最後に

Search · CaesarCipher python · GitHub

ちなみに似たようなことをしている人はコレだけいます。おわり♥♥♥

参考

Caesar Cipher Function in Python - Stack Overflow

Python で ROT13 (シーザー暗号) を書いてみる - CUBE SUGAR CONTAINER