シーザー暗号を生成するVBAのサンプルコード

記事内に広告が含まれています。

シーザー暗号を生成するVBAのサンプルコードを紹介します。

シーザー暗号とは

シーザー暗号は元の文章の中の各文字を、決められた文字数分シフトして暗号文とする暗号です。

文字数のシフト数が3の場合は下記のとおりです。

平文暗号文
excelbuzbi

古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が使用したことから、シーザー暗号と呼びます。

ただもちろん、この暗号方式は既に解読法がわかっている暗号方式です。

友達との遊びや、プログラムの練習として使用するのが良いでしょうね。

仕様

下記のような画面を用意し、暗号化ボタンを押下した際に、指定したシフト数分、文字がずれる仕様にします。

※ちなみに後ろにずれる例も見かけますが、前にズレるほうが正統派だと思いますのでその仕様にしました

制約

  • Aが入力された場合はアルファベットのZに戻り出力するというシンプルな仕様にするため、入力は全て英字に限定します。
    • アルファベットAからZに戻るだけでなく、記号やスペース、ひらがなや漢字を含めたときに文字体系ごとに考慮が必要になり、コードが複雑になるのを避けるためです。
  • 大文字・小文字は全て小文字に変換します。
    • 大文字Aの前は小文字のzでいいのか、大文字のZでいいのかという問題が出てきます。
  • カンマ、スペース、ピリオドは無視します。

ソースコード

暗号化ボタンに下記のソースコードを紐づけています。

もし画面への入出力が不要な場合は、Range(“~”)の部分を直接べた書きしても良いかと思います。

Option Explicit
Sub ボタン1_Click()
    'シフト数
    Dim shiftNum As String
    shiftNum = Range("A2").Value
    '平文(小文字)
    Dim inputText As String
    inputText = LCase(Range("B2").Value)
   
   '暗号文
    Dim outputText As String
    '一時変数
    Dim inputCharNum As Integer
    Dim i As Long
    Dim newCharNum As Integer
    
    '1文字ずつループする
    For i = 1 To Len(inputText)
        
        'Unicode文字セットを取得する
        inputCharNum = AscW(Mid(inputText, i, 1))
        
        Select Case True
            Case inputCharNum >= AscW("a") And inputCharNum <= AscW("z")
                'シフト数前の値を取得する
                newCharNum = inputCharNum - shiftNum
                
                If newCharNum < AscW("a") Then
                    'Unicode文字がa-zの範囲外の場合、a-zの文字数(26文字)を加算する
                    newCharNum = newCharNum + (AscW("z") - AscW("a") + 1)
                End If
            
            Case inputCharNum = AscW(",") Or inputCharNum = AscW(".") Or inputCharNum = AscW(" ") Or _
                    inputCharNum = AscW(vbCr) Or inputCharNum = AscW(vbLf)
                'カンマ、ピリオド、スペース、改行コード(CR、LF)を無視する
                newCharNum = inputCharNum
                
            Case Else
                'エラー処理
                MsgBox ("英字以外の文字が入力されています")
                Range("C2").Value = Empty
                Exit Sub
                
        End Select
                
        '文字列として結合する
        outputText = outputText + ChrW(newCharNum)
        
    Next
    '暗号文の出力
    Range("C2").Value = outputText
    MsgBox ("暗号化しました")
End Sub

テスト実行

ではテスト実行してみます。

実行前

平文は英文を入れ、シフト数は3を指定しています。

シフト数は3を指定しているため、C→z、o→l・・・と3文字ずつ前の文字にズレていくはずです。

実行後

想定通りの暗号化がされました。

参考情報

環境

下記の環境で作成・実行しております。

No.環境バージョン
1OSWindows10
2ExcelExcel2016
環境一覧

以上です。

コメント

タイトルとURLをコピーしました