滝の音

滝の音

名こそ流れてなお聞こえけれ

VBAで暗号を実装しよう その5 換字表をメモ帳で管理しよう

  • はじめに

今回は暗号を実装しようの第5弾かな?

今回も「形式の修正」です。

換字式暗号の肝である換字表の作成と読み込みです。

このコーナーの半分以上が暗号を実装しない回になってしまっている。

まだまだ「一歩目」が甘い証拠です。
体勢を崩しても転ばない技術よりは
体勢が崩れない道を選ぶ技術が欲しい

つまり王道の見極め

  • なぜ形式を修正するのか?

一応今のままでもコードは作動するのですが。
それでも修正したいのはひとえに
現状が抽象度の低い、不安定なコードだからです。

個人的に抽象度の高いコードが好きです。
現状は換字表はシートのある位置に書き込まれて
その位置を読み込むことで換字表を認識しているのですが
それは抽象度が低い。

もし何かの作動でシートに行列が挿入されて換字表が書き込まれたエリアがずれてしまったら
それだけで正常に作動しなくなってしまいます。

実は自分の書いたポリュビオス暗号はそれにも対応されてはいるのですが
「もしもの処理」が起こりうる要因がはっきり見えているのなら
それはつぶしておいたほうがいいと思います。

  • 換字表をメモ帳に書き込む

前回の「txt_output」に引数を導入する

みたいに簡単には解決しません。

どうしましょうかね~。

たしかポリュビオス暗号の回で最後に書いたのですが
メモ帳に換字表を保管することが現実的ですかね。

Function pattern_make()
 
 Dim field As Range
 Dim list() As Variant
 Dim d As Integer
 Dim tmp As String
 Dim pattern() As String
 Dim str As String
 Dim div As Integer
 Dim file_name As String
 
'----------------------
'作業用シートで並び替えて
'listに書き込む
'----------------------
 Sheets.Add
 
 For i = 1 To 83
    Cells(i, 1) = Chr(-32097 + (i - 1))
    Cells(i, 2) = Rnd()
 Next
 
 Set field = Range(Cells(1, 1), Cells(83, 2))
 field.Sort Cells(1, 2), xlAscending
 
 list = field
 
 Application.DisplayAlerts = False
 ActiveSheet.Delete
 Application.DisplayAlerts = True
'----------------------------
'換字表を作成する
'----------------------------
 div = 9
 ReDim pattern(0 To (83 - 1) \ div + 1)
'-----------------------------
'一列目の作成
'-----------------------------
 For i = 1 To div
    pattern(0) = pattern(0) & "   " & i
 Next
'-----------------------------
'それ以降の作成
'-----------------------------
 For i = 1 To UBound(list, 1)
    d = (i - 1) \ div + 1
    pattern(d) = pattern(d) & "  " & list(i, 1)
 Next
'-----------------------------
'文字列の連結
'-----------------------------
  For i = 0 To UBound(pattern)

    pattern(i) = i & pattern(i)
    str = str & pattern(i) & vbCrLf
 Next
'------------------------------
'strをファイルに書き出す
'------------------------------
 file_name = "C:\Users\DiCE\Desktop\work\kaeji.txt"
 Call txt_output(str, file_name)
 
End Function

んー。
とりあえず書いたんですけど
なんだか汚いし汎用性がなさそう。。。

結果はこんな感じ。

f:id:nozomi-hayashi:20180721024355g:plain

まぁ良しとしましょう。。

  • メモ帳の換字表を読み込む

この手のものは作り方さえわかってしまえば
読み込みはさほど難しくありません。

と思ったけどちょっと面倒なことが。
換字表を作成するときにVbCrLfを入れてしまった
つまり改行してしまいましたよね。

Line Input はテキストファイルの一行を読むものなので
それだけだとテキストデータを読みきれない。。

なので「txt_inputs」という関数を作って使うことにします。

まずは換字表を読み込む「pattern_input」から

Function pattern_input() As Integer()

 Dim ans() As Integer
 Dim tmp As Integer
 Dim file_name As String
 Dim str() As String
 Dim line As Variant
'--------------------
'換字表を読み込む
'--------------------
 file_name = "ファイル名を記述"
 
 str() = txt_inputs(file_name)
 
 ReDim ans(1 To 83)
 
 For i = 1 To UBound(str)
    line = Split(str(i), "  ")
    For j = 1 To UBound(line)
        tmp = Asc(line(j)) + 32098
        ans(tmp) = i & j
    Next
 Next

 pattern_input = ans
End Function

こちらは以前のタイプよりすっきりしたかもですね。
split関数はほんまに神です!

続いてFunction txt_inputs

Function txt_inputs(file_name) As String()
 Dim ans() As String
 Dim n As Integer
 
 n = 0
 
 Open file_name For Input As #1
    Do While Not EOF(1)
        ReDim Preserve ans(n)
        Line Input #1, ans(n)
        n = n + 1
    Loop
 Close #1
 txt_inputs = ans
End Function

ふぅ。

これにて実装完了!!

  • 一応テスト

ちゃんと動くか確認です。

暗号文
89 35 15 88 19 15 17 81 65 35   57 35 81 96 57 84 51   35 49 19 64 95 93 19 57 94 93 22 28 54   57 94 93 22 19 96 57 84 21   52 45 57 72 63 64 91 81 13 35 52 28 26 27 13 92 99 15 49 81 19 28   56 35 99 72 22 81 29 81 55 94 36 96 57 51 76 76 13 92 87 45

復元文

けいしきのしゅうせい ということばが いまのじぶんのとれんどです とれんどのことばは わりとにちじょうかいわでもつかってしまうので あいてにどうようされることがおおかったり

こんなもんでぃ!!

  • まとめ

暗号で話したとおり
「形式の修正」という言葉が今のトレンドです。

デザインってなくても生きてはいけると思うのですが
なんというか
華だなぁと思います。

そろそろ新しい暗号を作成したいですね~

次回はシーザー暗号!!
ゆうめいなやーつ。