pythonを用いた単一換字式暗号の実装

換字式暗号とは

平文を1文字あるいは複数文字に対し、別の文字・記号を割り当て変換することで暗号文を作り出す方式。
A⇆B B⇆D の場合、ABという平文はBDとなる。

実装

今回はpythonを用いて実装しました。文字の扱いはpythonの方が楽だと思ったのもあって、勉強&リハビリも兼ねて選びました。
では、コードです。

sigma = {'a':'@', 'b':'V', 'c':'4', 'd':'B', 'e':'*', 'f':'$', 'g':'(', 'h':'A', 'i':'J', 'j':'W', 'k':'O', 'l':']','m':'!',
         'n':'-', 'o':'+', 'p':'~', 'q':'^', 'r':'=', 's':'?', 't':'%', 'u':'H', 'v':'R', 'w':'Y', 'x':'C', 'y':'M', 'z':'T'}

def encryption(m):
  c = [sigma[a] for a in m]
  return c 

def decryption(c):
  m = []
  for a in c:
    for key, value in sigma.items():
      if value == a:
        m.append(key)
        break
    else:
      m.append('?')
  return m
      
if __name__=='__main__':
  print('暗号化(0) 復号(1) >> ', end='')
  f = int(input())
  print('文字列 >> ', end='')
  s = input()
  if f==1:
    c = decryption(s)
  else:
    c = encryption(s)
  print(''.join(c))

アルファベットに対し、記号や文字(テキトーに選びました)を辞書を用いて設定しました。
復号に関しては、割り当てのない値が来た時に「?」を代わりに表示するようにしてあります。
実行結果になります。

f:id:kisaragi211:20190223204120p:plain f:id:kisaragi211:20190223203423p:plain f:id:kisaragi211:20190223204132p:plain

1・2枚目は暗号化と復号です。3枚目も復号ですが、「a」に対応する「@」を「"」に変えてあります。
「"」に対応するキーはないので、復号できず「?」を表示してあります。

おわりに

単一換字式暗号は対応表を仲間内で共有しておく必要があるので、そこの管理は大変だと思いましたがそこさえクリアできれば転置式よりは安全だと思いました。
暗号技術のすべてでは、アルファベットに対しアルファベット(Aに対しDなど)を割り当てていましたが、記号を使うとより暗号感が出るなと思い少しアレンジを加えてみました。
引き続き暗号技術の勉強を頑張ります。

p.s.
python久々すぎて、簡単なプログラムでも結構時間かかりました。
あと作法が全くわからなかったので、汚コードだと思いますがご了承ください。