使い道とかどこにあるか分かりませんが
需要なくても書いて良いのがこういうブログみたいな場所なので
なんかシーザー暗号で遊びたいなって方は是非使ってやってください
ざっくり説明
渡された文字列をシーザー暗号にて処理して返します (復号も可)
ex.
EncriptAndDecryptWithCaesarCipher("TestMessage", 1) → "UftuNfttbhf"
EncriptAndDecryptWithCaesarCipher("UftuNfttbhf", -1) → "TestMessage"
コード
暗号化/復号(シーザー暗号)
Function EncriptAndDecryptWithCaesarCipher(ByVal text As String, ByVal shift As Long) As String
'================================
'用途 :シーザー暗号による暗号化/復号
'--------------------------------
'第一引数:平文/暗号文 (String型)
'第二引数:シフトする文字数 (Long型)
'戻り値 :第一引数が平文の場合→暗号文 (String型)
' 第一引数が暗号文の場合→平文 (String型)
'================================
Const NUM_OF_LETTERS As Long = 26
Const CHRCODE_UPPER_A As Long = 65
Const CHRCODE_UPPER_Z As Long = 90
Const CHRCODE_LOWER_A As Long = 97
Const CHRCODE_LOWER_Z As Long = 122
Dim characterCount As Long
characterCount = Len(text)
Dim i As Long
Dim ciphertext As String
For i = 1 To characterCount
Dim targetCharacter As String
targetCharacter = Mid(text, i, 1)
Dim targetCharacterCode As Long
targetCharacterCode = AscW(targetCharacter)
Select Case targetCharacterCode
Case CHRCODE_UPPER_A To CHRCODE_UPPER_Z
ciphertext = ciphertext + ChrW(((targetCharacterCode + shift _
- (CHRCODE_UPPER_A Mod NUM_OF_LETTERS)) Mod NUM_OF_LETTERS) + CHRCODE_UPPER_A)
Case CHRCODE_LOWER_A To CHRCODE_LOWER_Z
ciphertext = ciphertext + ChrW(((targetCharacterCode + shift _
- (CHRCODE_LOWER_A Mod NUM_OF_LETTERS)) Mod NUM_OF_LETTERS) + CHRCODE_LOWER_A)
Case Else
ciphertext = ciphertext + targetCharacter
End Select
Next
EncriptAndDecryptWithCaesarCipher = ciphertext
End Function
使用方法
第一引数に暗号化/復号対象の文字列
第二引数にシフトする文字の数
を渡します。
第ニ引数を1にすると AはB になり、5にすると AはF になります
仕様等
- 対象文字は[A-Z]と[a-z]のみで、他の文字はそのまま表示されます
- 復号の関数も同じです。第二引数を3で暗号化したなら、第一引数に暗号文/第二引数に-3を渡すことで復号できます
※日本語も処理可能と言えば可能ですが、「あ」の次は「い」であることは明確ながらも、「ど」の次は何の文字であるのが適切かなど不明点が多いので作ってないです。
注意点
特になし
その他
最初にConstで宣言してるものをFor文内に直接書いたり
計算後数値にすることで1割ぐらい高速化できます。
とは言え元々3000文字で0.01秒以下なんですが。