スキュタレー暗号を実装してみる

情報セキュリティ

こんにちは。引き続き暗号を実装してみるシリーズを続けていきます。今回はスキュタレー暗号を取り上げます。なお、前回のシーザー暗号の最後に書いた暗号を復号したものは"iwillalwaysloveyou"で、ホイットニー・ヒューストンのI Will Always Love Youでした。

スキュタレー暗号とは

スキュタレー暗号の歴史は、

と紀元前7世紀のギリシャの詩人アルキロコスによって記述されたとか

と紀元前5世紀にスパルタで使用されたとか、よくわからないので深入りしないで進みます。

とりあえず共通しているのは、棒状のものに革紐を巻き付けて復号するということです。

棒に巻き付けて

戻すと

と暗号化できます。

スキュタレー暗号を実装してみる

それでは、相変わらずのPythonで実装してみます。

def encrypt( text, n ):
  length = int( len(text) / n )
  mod = len(text) % n
  result = ''

  i = 0
  while i < length + ( 1 if mod != 0 else 0 ):
    j = 0
    m = 0
    while j < n:
      index = j * length + i + m
      if index >= len(text) or i*n+j >= len(text):
        break
      result += text[index]
      j += 1
      if j!=0 and j<=mod:
        m += 1
    i += 1
  return result

def decrypt( text, n ):
  result = text[0]
  index = n
  j = 0
  while j < n:
    if index < len(text):
      result += text[index]
    if index + n >= len(text):
      j += 1
      index = j
    else:
      index += n
  return result


if __name__ == '__main__':
  plain_text  = 'impossibleisnothing'
  print( plain_text )

  cipher_text = encrypt( plain_text, 6 )
  decode_text = decrypt( cipher_text, 6 )
  print( 'encrypt : ' + cipher_text )
  print( 'decrypt : ' + decode_text )

巻き付ける棒の太さを6としています。革紐に書かれた文字の長さは棒の太さで割り切れなくても暗号化・復号ができるようにしています。

その実行結果です。

impossibleisnothing
encrypt : isbioimslstnpienhgo
decrypt : impossibleisnothing

スキュタレー暗号の弱点

とにかく平文の1文字目と暗号の1文字目が一致することです。また、スキュタレー暗号であることがわかってしまえば、いろいろな太さの棒に巻き付けてみて復号を試みることができてしまうことです。

また、実際に手作業をして感じたことは、紐に対して斜めにならないように書くのが難しいということです。角度が付いてしまうと、スキュタレー暗号ということに気付かれやすいため、気を付けなければならないと思います。

それでは、今日はおしまいにします。それではまた。

Posted by 春日井 優