2026年1月18日日曜日

【Javaアルゴリズム探求】古典暗号「ROTn」の実装:クラス設計とJavaDocで学ぶ「機能の独立」

 

1. 導入:暗号の世界への第一歩

セキュリティが不可欠な現代のシステム開発において、暗号の仕組みを理解することは非常に重要です。今回はその入門として、古典暗号の一つである「ROTn(シーザー暗号)」をJavaで実装してみます。

単に動くだけでなく、再利用しやすい「暗号化・復号クラス」の設計と、プロの現場で欠かせない「メソッドの説明コメント(JavaDoc)」の書き方を探求します。


2. ROTn(シーザー暗号)とは?

ROTn(Rotate by n)は、アルファベットを一定の数(n)だけ後ろにずらすシンプルな暗号です。

  • ROT3の場合: 'A' は3つ後の 'D' に変換されます。

  • 復号: 暗号化された文字を逆に3つ戻せば、元のメッセージが手に入ります。


3. 実践:ROTn変換クラスの設計

暗号化と復号のロジックを独立させ、誰が読んでも使い方がわかるようにコメントを充実させたクラスを作成しました。

【検証コード:RotCipher.java】

Java
/**
 * ROTn形式の暗号化と復号を行うクラスです。
 */
public class RotCipher {
    private final int shift;

    /**
     * 指定したシフト数で暗号化クラスを初期化します。
     * @param shift アルファベットをずらす数(0-25推奨)
     */
    public RotCipher(int shift) {
        this.shift = shift % 26;
    }

    /**
     * 入力された文字列を暗号化します。
     * @param text 暗号化したい平文
     * @return 暗号化された文字列
     */
    public String encrypt(String text) {
        return transform(text, shift);
    }

    /**
     * 暗号化された文字列を元の平文に復号します。
     * @param text 復号したい暗号文
     * @return 復号された文字列
     */
    public String decrypt(String text) {
        // 26からシフト数を引くことで、逆回転を実現します
        return transform(text, 26 - shift);
    }

    /**
     * アルファベットを回転させるコアロジックです。
     * 記号や数字は変換せずそのまま保持します。
     * @param text 対象の文字列
     * @param move ずらす数
     * @return 変換後の文字列
     */
    private String transform(String text, int move) {
        StringBuilder result = new StringBuilder();
        for (char c : text.toCharArray()) {
            if (Character.isLetter(c)) {
                char base = Character.isUpperCase(c) ? 'A' : 'a';
                // 剰余演算(%)を使ってアルファベットの範囲内でループさせます
                c = (char) (base + (c - base + move) % 26);
            }
            result.append(c);
        }
        return result.toString();
    }
}


4. 動作検証:暗号と復号のサイクル

作成したクラスを使って、実際にメッセージが秘匿され、正しく元に戻るか検証します。

【実行用コード:Main.java】

Java
public class Main {
    public static void main(String[] args) {
        // ROT3(3つずらす)を設定
        RotCipher rot3 = new RotCipher(3);
        String original = "Hello Java World!";
        
        // 暗号化を実行
        String encrypted = rot3.encrypt(original);
        System.out.println("暗号化結果: " + encrypted); // Khoor Mdyd Zruog!
        
        // 復号を実行
        String decrypted = rot3.decrypt(encrypted);
        System.out.println("復号結果 : " + decrypted); // Hello Java World!
    }
}


5. 探求:なぜコメント(JavaDoc)が必要なのか?

今回のコードには /** ... */ 形式のコメントを追加しました。これは単なるメモではなく、「このメソッドは何をするものか、何を受け取って何を返すのか」を明確にするプロの作法です。

  1. 利用者のため: クラスを使う人が、中身のロジックを解読しなくても使い方がわかります。

  2. 保守のため: 数ヶ月後の自分が見たとき、なぜこの引数が必要なのかをすぐに思い出せます。

  3. ツールの活用: IntelliJ IDEAなどのIDEでは、この形式で書くことでマウスホップ時に説明文が自動表示されるようになります。


6. まとめ:11本目の探求を終えて

ROTnはシンプルなアルゴリズムですが、「クラスを分ける」「意味のある名前をつける」「ドキュメントを残す」といった、これまで学んだプロの要素がすべて凝縮されています。

目標の20本に向けて、次はより複雑なアルゴリズムや、エラーを未然に防ぐための「例外処理」の探求などにも挑戦してみたいと思います。

0 件のコメント:

コメントを投稿

【Javaアルゴリズム探求】古典暗号「ROTn」の実装:クラス設計とJavaDocで学ぶ「機能の独立」

  1. 導入:暗号の世界への第一歩 セキュリティが不可欠な現代のシステム開発において、暗号の仕組みを理解することは非常に重要です。今回はその入門として、古典暗号の一つである「ROTn(シーザー暗号)」をJavaで実装してみます。 単に動くだけでなく、再利用しやすい「暗号化・復号...