0
0

[Excel VBA] シーザー暗号で暗号化する

Last updated at Posted at 2024-08-29

使い道とかどこにあるか分かりませんが
需要なくても書いて良いのがこういうブログみたいな場所なので:relieved:
なんかシーザー暗号で遊びたいなって方は是非使ってやってください

ざっくり説明

渡された文字列をシーザー暗号にて処理して返します (復号も可)

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秒以下なんですが。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0