JavaScriptでシーザー暗号を使って文字列を暗号化する方法
シーザー暗号とは
シーザー暗号(Caesar Cipher)は、最もシンプルかつ広く知られている暗号化手法のひとつです。古代ローマのユリウス・カエサルが軍事通信に用いたことでも知られており、平文の各文字をアルファベット上で一定の文字数だけずらした別の文字に置き換える「単一換字式暗号」に分類されます。
たとえば、3文字左へずらす場合、D は A に、E は B というように変換されていきます。
ここでは、第1引数に暗号化したい文字列、第2引数にシフト量を受け取る JavaScript 関数を実装します。シフト量には正負どちらの整数も指定でき、正の値は右方向へのシフト、負の値は左方向へのシフトを意味します。
コード例
以下が実際のコードです。
const str = 'thisIsAString';
const getMap = (legend, shift) => {
return legend.reduce((charsMap, currentChar, charIndex) => {
const copy = { ...charsMap };
let ind = (charIndex + shift) % legend.length;
if (ind < 0) {
ind += legend.length;
};
copy[currentChar] = legend[ind];
return copy;
}, {});
};
const encrypt = (str, shift = 0) => {
const legend = 'abcdefghijklmnopqrstuvwxyz'.split('');
const map = getMap(legend, shift);
return str
.toLowerCase()
.split('')
.map(char => map[char] || char)
.join('');
};
console.log(encrypt(str, 6));仕組みの解説
このコードは主に2つの関数で構成されています。
- getMap(): アルファベット26文字を配列 legend として受け取り、reduce を使って「元の文字 → シフト後の文字」という対応表(マップ)を生成します。剰余演算
(charIndex + shift) % legend.lengthによって末尾を超えた場合は先頭へ折り返し、負のシフト量に対してもind += legend.lengthの処理で正しく対応しています。 - encrypt(): 入力文字列をいったん小文字に統一してから1文字ずつ分解し、マップに存在する文字だけを置き換えて結合します。マップに存在しない数字や記号は
map[char] || charの評価によりそのまま保持されます。
出力結果
コンソールには次のように出力されます。
znoyoygyzxotm
-
JavaScriptのshift()メソッドとは?配列の先頭要素を削除する方法を解説
JavaScriptのshift()メソッドとはJavaScriptのshift()メソッドは、配列から先頭(最初)の要素を取り除き、その要素を返すメソッドです。この操作により配列の長さは1つ減少します。なお、末尾の要素を削除したい場合はpop()メソッドを使用し、先頭に要素を追加したい場合はunshift()メソッドを使います。shift()メソッドのコード例以下は、ボタンをクリックすると配列の先頭要素が削除されるサンプルコードです。<!DOCTYPE html> <html lang="ja"> <head> <meta cha
-
JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説
JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro