暗号の世界へようこそ!PythonとJavaScriptで実装できる簡単な暗号化アルゴリズム。
今回は、単語を暗号化するアルゴリズムを書いてみましょう。
カエサル暗号とは何でしょう?
暗号と言うと難しいそうですが、ロジックは簡単で、文字列をシフトしていくだけのシンプルな暗号です。
実行例
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
いかがでしたか?プロセス自体は、そんなに難しくないと思います。エッジケースだけちょっと頭を使いますね。
この記事が気に入ったらサポートをしてみませんか?