見出し画像

暗号の世界へようこそ!PythonとJavaScriptで実装できる簡単な暗号化アルゴリズム。

今回は、単語を暗号化するアルゴリズムを書いてみましょう。

カエサル暗号とは何でしょう?

暗号と言うと難しいそうですが、ロジックは簡単で、文字列をシフトしていくだけのシンプルな暗号です。

任意の単語Aがあるとすると、各文字をN回シフトせよ。マイナス方向にもシフトできるものとする。なお、大文字はそのままとする。

実行例

caesarCipher("Zoo Keeper", 2) //Bqq Mggrgt

caesarCipher("Big Car", -16) //Lsq Mkb

caesarCipher("javascript", -900) //Tkfkcmbszd

例は、Zoo Keeperという文字列があったとします。それを2文字分、シフトせよという意味です。結果「Bqq Mggrgt」という単語が登場します。これが暗号化です。Zを正方向に2文字分シフトすると「Z」→「A」→「B」ですね。

ちなみに、マイナス方向だと「A」→「Z」→「Y」です。

例では「2」が秘密の鍵になっているわけです。(2という数字がバレると解読されてしまいます。。。)

解答例

function caesarCipher(str, num) {
 //numが26を超えた場合、
 num = num % 26;
 var lowerCaseString = str.toLowerCase();
 var alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
 var newString = "";

 for (let i = 0; i < lowerCaseString.length; i++) {
   var currentLetter = lowerCaseString[i];

   if (currentLetter === " ") {
     newString += currentLetter;
     continue;
   }

   var currentIndex = alphabet.indexOf(currentLetter);
   var newIndex = currentIndex + num;

   if (newIndex > 25) newIndex = newIndex - 26;
   if (newIndex < 0) newIndex = 26 + newIndex;

   //大文字だった場合
   if (str[i] === str[i].toUpperCase()) {
     newString += alphabet[newIndex].toUpperCase();
   } else newString += alphabet[newIndex];
 }
 return newString;
}

//console.log(caesarCipher("Zoo Keeper", 2)); //Bqq Mggrgt

ロジックのプロセスを追ってみましょう。

1.あらかじめアルファベットの配列を作成する。

2.アルファベットの配列を元に、暗号化したい単語の位置(index)を取得する。

3.取得した位置(index)にNを足して、新し位置を取得する。

4.新し位置(index)の文字を、変数に足し込んでいく。

5.上記を、文字列分繰り返す。

注意点はアルファベットのindex「26」を超えてしまった場合、またマイナスになった場合です。

if (newIndex > 25) newIndex = newIndex - 26;
if (newIndex < 0) newIndex = 26 + newIndex;

Indexが27になった場合は、 27-26=1 で 「a」を返します。マインス方向にシフト 1 -16 = -15の場合は、26 -15 = 11 「k」を返します。

Python版コード

def caesar_cipher(string, num):
    num = num % 26
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    new_string = ""

    for char in string:
        if char.isalpha():
            is_upper = char.isupper()
            char = char.lower()
            index = alphabet.index(char)
            new_index = (index + num) % 26
            encrypted_char = alphabet[new_index]
            if is_upper:
                encrypted_char = encrypted_char.upper()
            new_string += encrypted_char
        else:
            new_string += char
    
    return new_string

# 使用例
print(caesar_cipher("Zoo Keeper", 2))  # Bqq Mggrgt
print(caesar_cipher("Big Car", -16))  # Lsq Mkb
print(caesar_cipher("javascript", -900))  # Tkfkcmbszd

いかがでしたか?プロセス自体は、そんなに難しくないと思います。エッジケースだけちょっと頭を使いますね。




この記事が気に入ったらサポートをしてみませんか?