シーザー暗号を生成するVBAのサンプルコードを紹介します。
シーザー暗号とは
シーザー暗号は元の文章の中の各文字を、決められた文字数分シフトして暗号文とする暗号です。
文字数のシフト数が3の場合は下記のとおりです。
平文 | 暗号文 |
---|---|
excel | buzbi |
古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が使用したことから、シーザー暗号と呼びます。
ただもちろん、この暗号方式は既に解読法がわかっている暗号方式です。
友達との遊びや、プログラムの練習として使用するのが良いでしょうね。
仕様
下記のような画面を用意し、暗号化ボタンを押下した際に、指定したシフト数分、文字がずれる仕様にします。
※ちなみに後ろにずれる例も見かけますが、前にズレるほうが正統派だと思いますのでその仕様にしました。
制約
- 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. | 環境 | バージョン |
---|---|---|
1 | OS | Windows10 |
2 | Excel | Excel2016 |
以上です。
コメント