以前、本連載の14回目では「シーザー暗号」について紹介しました。暗号化がどのような仕組みで成り立っているのか知るのは楽しくまたプログラミングの勉強になります。今回は戦国時代に上杉謙信が使っていた「上杉暗号」のプログラムを実装してみましょう。

  • 上杉暗号を作成・解読するプログラムを作ってみよう

    上杉暗号を作成・解読するプログラムを作ってみよう

「上杉暗号(字変四十八)」とは

「上杉暗号(字変四十八)」は戦国時代に使われた暗号で、戦国武将として有名な上杉謙信の軍師であった宇佐美定行が考案したと言われています。その仕組みはとてもシンプルです。最初に7×7の表を作り、そこに「いろはうた」を書き込みます。そして表の列と行の番号を使って文字を表現するというものです。

実際にExcelなどを使って「いろはうた」の表を作ってみましょう。この表を元に暗号文を作るには、最初に文字を選び、その文字の縦列と横行の番号を参照します。逆に暗号文を解読するには、番号の場所にある文字を読みます。

  • いろはうたを表に書き込んだところ

    いろはうたを表に書き込んだところ

例えば、「今日何が食べたい?」と聞いた時に、上杉暗号で「四六 五五 四五 六六 五一 六三」と答えが返ってきたとします。どういう意味でしょうか。

上記の表を参照して、2文字1組として確認していきましょう。四列六行目を確認すると「お」です。続く五列五行目は「こ」、 四列五行目は「の」、同様に見ていくと、「おこのみやき」となります。この表があれば、簡単に上杉暗号が解読できますね。

プログラムで上杉暗号を解読してみよう

さて、上杉暗号の仕組みが分かったところで、実際のプログラムを作ってみましょう。上杉暗号のポイントは表にあります。そのため、プログラムを作る場合も、まずはこの表をどのように表現するのかが鍵となります。

ここでは、配列変数に入れて管理すると簡単になりそうです。次のような二次元配列変数の表を利用します。この表を使えば上杉暗号を簡単に解読するツールが作れます。

変換表=[
  ["い","ろ","は","に","ほ","へ","と"],["ち","り","ぬ","る","を","わ","か"],
  ["よ","た","れ","そ","つ","ね","な"],["ら","む","う","ゐ","の","お","く"],
  ["や","ま","け","ふ","こ","え","て"],["あ","さ","き","ゆ","め","み","し"],
  ["ゑ","ひ","も","せ","す","ん"," "]
]

「なでしこ3簡易エディタ」に以下の上杉暗号を解くプログラムを入力して実行してみましょう。

#↓以下に上杉暗号を入力して実行しよう
「465545665163」の上杉暗号解読して表示。

●(Sの)上杉暗号解読とは
  変換表=[
   ["い","ろ","は","に","ほ","へ","と"],["ち","り","ぬ","る","を","わ","か"],
   ["よ","た","れ","そ","つ","ね","な"],["ら","む","う","ゐ","の","お","く"],
   ["や","ま","け","ふ","こ","え","て"],["あ","さ","き","ゆ","め","み","し"],
   ["ゑ","ひ","も","せ","す","ん"," "]
  ]
  答え=「」
  Sの「 」を「」に置換してSに代入。
  # 上杉暗号を2文字1組として繰り返し取り出す --- (*1)
  Nを0から((Sの文字数)÷2-1)まで繰り返す
    Sで(N×2+1)から1文字抜き出して整数変換してF列に代入。 
    Sで(N×2+2)から1文字抜き出して整数変換してF行に代入。
    C=変換表[F列-1][F行-1] # 変換表を参照 --- (*2)
    答え=答え&「[{F列}{F行}:{C}]」
  ここまで。
  答えを戻す。
ここまで。

すると、以下のように、プログラムが実行されます。今回、プログラムを短くするために、漢数字ではなくローマ数字を入力する必要がありますが、プログラムの2行目に上杉暗号を指定すると、対応する文字を表から選び出して画面に答えを出力します。

  • いろはうたを表に書き込んだところ

    上杉暗号を解読するプログラム

プログラムを確認してみましょう。(*1)では上杉暗号を2文字1組として列と行を組数だけ繰り返します。繰り返しの中では、変数「F列」に1文字目、変数「F行」が2文字になるように取り出します。そして、(*2)で変換表を参照します。変換表は二次元配列変数になっているので、列と行番号を順に指定することで該当する文字を取得できます。なお、なでしこの配列変数は0起点となっているため、F列とF行の値を-1してから取り出します。

プログラムで上杉暗号を作成しよう

解読するプログラムを作ったら、次に暗号を作成するプログラムも作ってみましょう。先ほどの変換表を元にして、どの文字にどの数値を割り当てて良いかを先に調べて、辞書型データに代入していきます。そして、暗号文を作成するときに辞書型に入っている値を取り出すと暗号文が完成します。それでは、作ってみましょう。

# ↓に作成したい文をひらがなで入力
「おこのみやき」の上杉暗号作成して表示。

●(Sの)上杉暗号作成とは
  変換表=[
   ["い","ろ","は","に","ほ","へ","と"],["ち","り","ぬ","る","を","わ","か"],
   ["よ","た","れ","そ","つ","ね","な"],["ら","む","う","ゐ","の","お","く"],
   ["や","ま","け","ふ","こ","え","て"],["あ","さ","き","ゆ","め","み","し"],
   ["ゑ","ひ","も","せ","す","ん"," "]
  ]
  #変換表を元に対応表を作る --- (*1)
  対応辞書 = {}
  Yを0から6まで繰り返す
    Xを0から6まで繰り返す
      C=変換表[Y][X]
      対応辞書[C] = 「{Y+1}{X+1}」
    ここまで
  ここまで。
  #対応表を元に上杉暗号を出力 --- (*2)
  結果=「」
  Nを1から(Sの文字数)まで繰り返す
    SでNから1文字抜出してCに代入。
    もし、対応辞書[C]=未定義でなければ、C=対応辞書[C]
    結果=結果&C
  ここまで。
  結果を戻す。
ここまで。

プログラムを実行してみましょう。すると「おこのみやき」から上杉暗号を作成して画面に表示します。入力する文はひらがなで入力しましょう。また、濁点などは変換表にないのでうまく変換できません。

  • 暗号を作成するプログラムを実行したところ

    暗号を作成するプログラムを実行したところ

プログラムを確認してみましょう。(*1)では変換表を元に対応表を作成します。その後、(*2)を利用して1文字ずつ対応する上杉暗号に変換します。

改良してみよう

この記事は
Members+会員限定記事です。

ログイン/会員登録する