[Excel VBA] ポリュビオス暗号で暗号化する

### 最初に一言
ネストが深いんじゃぁ


### ざっくり説明
- 渡された文字列をポリュビオスの暗号表に当てはめて暗号化します
- 渡された暗号文をポリュビオスの暗号表に当てはめて復号します

### そもそもポリュビオス暗号とは
暗号表という物を用いて、特定の文字を別の文字(数字含む)に置き換える換字式暗号です。

### コード
```vb:暗号化(ポリュビオスの暗号表)
Function EncryptWithPolybiusSquare(ByVal plaintext As String, ByVal WS As Worksheet) As String
'================================
'用途　　：ポリュビオスの暗号表による暗号化
'--------------------------------
'第一引数：平文 (String型)
'第二引数：暗号表のあるシートのWorksheetオブジェクト (Worksheet型)
'戻り値　：暗号文 (String型)
'================================
    Dim PS_ARR As Variant
    PS_ARR = LoadPolybiusSquare(WS, 1, 1)

    Dim convertedText As String
    Dim i As Long
    For i = 1 To Len(plaintext)
        Dim convertedCode As String
        Dim j As Long
        For j = 0 To 99
            If Mid(plaintext, i, 1) = PS_ARR(j) Then
                convertedCode = Right("0" & j, 2)
                convertedText = convertedText + convertedCode
                Exit For
            End If
        Next
    Next

    EncryptWithPolybiusSquare = convertedText
End Function
```

```vb:復号(ポリュビオスの暗号表)
Function DecryptWithPolybiusSquare(ByVal ciphertext As String, ByVal WS As Worksheet) As String
'================================
'用途　　：ポリュビオスの暗号表による復号
'--------------------------------
'第一引数：暗号文 (String型)
'第二引数：暗号表のあるシートのWorksheetオブジェクト (Worksheet型)
'戻り値　：平文 (String型)
'================================
    Dim PS_ARR As Variant
    PS_ARR = LoadPolybiusSquare(WS, 1, 1)

    Dim convertedText As String
    Dim i As Long
    For i = 1 To Len(ciphertext) Step 2
        Dim code As Long
        code = Mid(ciphertext, i, 2)
        
        Dim convertedCharacter As String
        convertedCharacter = PS_ARR(code)
        convertedText = convertedText + convertedCharacter
    Next

    DecryptWithPolybiusSquare = convertedText
End Function
```

```vb:ポリュビオス方陣の読み込み
Function LoadPolybiusSquare(ByVal WS As Worksheet, ByVal col As Long, ByVal row As Long) As Variant
'================================
'用途　　：ポリュビオス方陣の読み込み
'--------------------------------
'第一引数：Worksheetオブジェクト (Worksheet型)
'第二引数：ポリュビオス方陣 左上セル行番号 (Long型)
'第三引数：ポリュビオス方陣 左上セル列番号 (Long型)
'戻り値　：ポリュビオス方陣の配列 (Variant型)
'================================
    Dim PS_TOPLEFT_CELL As Range
    Dim PS_BOTTOMRIGHT_CELL As Range
    Dim PS As Range
    Set PS_TOPLEFT_CELL = WS.Cells(col, row) 'ポリュビオス方陣の左上セルを指定
    Set PS_BOTTOMRIGHT_CELL = PS_TOPLEFT_CELL.Offset(9, 9)
    Set PS = WS.Range(PS_TOPLEFT_CELL, PS_BOTTOMRIGHT_CELL)

    Dim prePS_ARR As Variant
    prePS_ARR = PS.Value

    Dim PS_ARR(0 To 99) As String
    Dim i As Long
    For i = 1 To 10
        Dim j As Long
        For j = 1 To 10
            Dim num_str As String
            Dim num_lng As String
            num_str = CStr(i Mod 10) & CStr(j Mod 10)
            num_lng = CLng(num_str)
            PS_ARR(num_lng) = prePS_ARR(i, j)
        Next
    Next

    LoadPolybiusSquare = PS_ARR
End Function
```

### 使用方法
第一引数に暗号化/復号対象の文字列
第二引数に暗号表のあるシートのオブジェクト
を渡します。

`LoadPolybiusSquare()`という3つ目のFunctionは共通の部品なので、
どちらを使用する場合も導入が必要です。


### 仕様等
- 表にない文字は暗号化されません
- 表にないコードは復号されません
- 大文字/小文字、全角/半角は区別されます

### 注意点
- 暗号表は10×10の範囲まで使用でき、下表のような方眼の列番号と行番号の組み合わせが暗号化後の文字列となります
- ポリュビオス方陣の位置は`LoadPolybiusSquare()`へ渡す引数で制御しています。下表にてAが入力されているセル位置を`LoadPolybiusSquare()`へ渡して下さい。例えば下表のAと入力されたセルがF3セルに入力されているのであれば、`LoadPolybiusSquare()`の第二引数は3、第三引数は6(Fは6番目であるため)となります
- 平文に" "を使用した場合、スペース(" ")も暗号表に入力して下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862825/ac857159-b36d-d27a-7590-9085da247be0.png)

### その他
特になし