JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで文字列を暗号化する方法|シーザー暗号のシフト実装

JavaScriptでは、第1引数に文字列、第2引数に数値を受け取る関数を実装することで、簡単な文字列暗号化を行うことができます。

この記事で紹介するのは、いわゆる「シーザー暗号」と呼ばれる古典的な暗号方式です。仕組みは非常にシンプルで、文字列に含まれる各アルファベットを、指定された数だけアルファベット順にずらすことで暗号文を生成します。

重要なのは、シフトがアルファベットの末尾(z)を超えた場合には先頭(a)に戻り、逆に先頭より前になった場合には末尾(z)へ折り返されるという点です。これにより、「a」の前が「undefined」などの無効な値になることなく、常に正しい文字へと循環します。

実装例

以下のコードでは、文字列内の大文字・小文字を判別しながら、英字以外の文字(スペースや記号など)はそのまま出力するように処理しています。また、負の数値が渡された場合にも対応できるよう、インデックスの範囲チェックを行っています。

const str = 'this is a str';
const encryptString = (str = '', num = 1) => {
    const alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
    str = str.toLowerCase();
    let res = "";
    for (let i = 0; i < str.length; i++) {
        const letter = str[i];
        if (alphabet.indexOf(letter) === -1) {
            res += letter;
            continue;
        }
        let index = alphabet.indexOf(letter) + num % 26;
        if (index > 25){
            index -= 26;
        };
        if (index < 0){
            index += 26;
        };
        if(str[i] === str[i].toUpperCase()){
            res += alphabet[index].toUpperCase();
        }else{ res += alphabet[index];
        };
    }
    return res;
};
console.log(encryptString(str, 4));

コードのポイント

  • アルファベット配列: 「a」から「z」までの26文字を配列として用意し、indexOf()で文字位置を特定します。
  • シフト量の正規化: num % 26 により、26以上の大きな数値が渡されても1周分に収まるよう調整しています。
  • 折り返し処理: インデックスが25(「z」)を超えたら26を引き、0未満になったら26を足すことで、アルファベットを環状に扱えます。
  • 大文字の保持: 元の文字が大文字だった場合は、変換後も大文字のまま出力されます。

実行結果

このコードをコンソールで実行すると、以下の出力が得られます。

xlmw mw e wxv

元の文字列「this is a str」の各文字が4つ分ずつ後ろにずらされ、「xlmw mw e wxv」という暗号文になっていることが確認できます。例えば「t」は4つ進んで「x」に、「s」は「w」に置き換わっています。

なお、復号したい場合は、同じ関数に負の数値(この例では-4)を渡せば元の文字列に戻すことができます。シーザー暗号はセキュリティ強度としては低いため実運用には向きませんが、文字列操作やループ処理の学習教材として最適です。

  1. JavaScriptで文字列を暗号化するアルゴリズムの実装方法

    問題文字列を受け取り、次のアルゴリズムに従って暗号化するJavaScript関数を作成します。入力される文字列は、スペースで区切られた単語のみで構成されているものとします。文字列内の各単語に対して、以下のルールを適用して暗号化を行います。最初の文字:ASCIIコード(10進数)に変換します。2番目の文字と最後の文字:互いに入れ替えます。このルールに従うと、たとえば「good」という文字列は「103doo」へと変換されます。具体的には、最初の「g」がASCIIコードの「103」に置き換わり、2番目の「o」と最後の「d」が入れ替わるためです。コード例以下が実際のコードです。 { const

  2. JavaScriptで指定した文字数に文字列を切り詰める方法

    JavaScriptでは、長いテキストを一覧表示やプレビュー用に短く表示したい場面がよくあります。この記事では、文字列と数値を受け取り、指定された文字数を超える場合は文字列を切り詰めて末尾に「...」を付けて返す関数の実装方法を解説します。要件作成する関数は、文字列と数値の2つの引数を受け取ります。文字列の長さが指定された数値より大きい場合は、先頭から指定文字数分だけ切り取った文字列に「...」を連結して返します。切り詰める必要がない場合(元の文字列が指定文字数以下の場合)は、元の文字列をそのまま返します。コード例以下がその実装コードです。 { const { length: len