モノアルファベット暗号の主な手法とは?加算暗号・乗算暗号・アフィン暗号を徹底解説
モノアルファベット暗号(単一換字暗号)には、さまざまな技法が存在します。本記事では、代表的な3つの手法である「加算暗号」「乗算暗号」「アフィン暗号」について、それぞれの仕組みと具体例を交えてわかりやすく解説します。
加算暗号(Additive Cipher)
加算暗号は、アルファベットの文字の並び順を入れ替える方法の一つです。各文字を一定の数だけ循環的にシフトさせ、文字同士の相対的な順序はそのまま維持されるのが特徴です。
文字が何文字分ずらされたかを示す数値を「鍵(キー)」と呼びます。例えば、鍵として「5」を使用した場合、「a」はアルファベット上で5文字分右に移動して「F」に、「b」は「G」というように変換されていきます。
「u」は「Z」に変換され、そこから先はアルファベットの先頭へ折り返されます。つまり「v」は「A」に対応付けられるといった具合です。
また、加算暗号は文字の位置番号を利用して実現することもできます。この方法では、英字「A」から「Z」までを位置番号「0」から「25」に対応させます。
乗算暗号(Multiplicative Cipher)
乗算暗号は、アルファベットの順列を作り出すもう一つの手法です。鍵の値を用意し、各文字の位置番号にその鍵を掛け、得られた積を26で割った余り(mod 26)を計算します。
例えば、平文の文字(P)が「h」で、鍵(K)が「5」の場合、暗号文の文字はモジュロ演算による乗算 C = P × K (mod 26) で求められます。位置番号では「h」は「7」に相当するため、C = 7 × 5 = 35 となり、35 mod 26 = 9 です。位置番号「9」は文字「J」に対応するため、暗号文の文字は「J」になります。
アフィン暗号(Affine Cipher)
アフィン暗号はモノアルファベット換字暗号の一種で、各文字を数学的な値に対応付け、簡単な数式を使って暗号化した後、再び文字へと変換し直す方式です。
この数式により、各文字は必ず別の一文字へ暗号化され、復号時には元の文字へ戻ります。つまり、どの文字がどの文字に対応するかを決める規則に従う、標準的な換字暗号だと言えます。
加算暗号と乗算暗号の組み合わせ
アフィン暗号は、加算暗号と乗算暗号をつなぎ合わせることで生成されます。これは2つの暗号を一組の鍵でまとめたもの考えてよく、最初の鍵は乗算暗号に、2番目の鍵は加算暗号に使用されます。この鍵のセットは、メッセージの送信者と受信者が共有する秘密鍵となります。
暗号化・復号の数式
アフィン暗号は本質的に2つの暗号を連続して適用するものであり、暗号化や復号を次のように1つの複合操作として表現できます。
暗号化:C = ((P × K1) + K2) mod n
復号:P = ((C − K2) × K1−1) mod n
ここで T は中間結果を表し、暗号化では「乗算」と「加算」、復号では「減算」と「除算」という2つの独立した操作を示しています。
逆変換の関係性
複数の暗号を組み合わせているため、アフィン暗号では暗号化・復号の各手順に必ず逆変換が存在します。暗号化の最後の操作が加算であれば、復号の最初の操作は減算になります。同様に、暗号化の最初の操作が乗算であれば、復号の最後の操作は除算になるのです。
-
現代ブロック暗号の構成要素とは?Dボックス・Sボックス・循環シフトを徹底解説
現代ブロック暗号とは現代のブロック暗号とは、mビットの平文ブロックを暗号化し、mビットの暗号文ブロックを復号する暗号方式です。暗号化および復号の処理にはKビットの鍵が使用され、復号アルゴリズムは暗号化アルゴリズムの逆操作として機能します。また、暗号化と復号の両方で同じ鍵が用いられます。ブロック暗号は、nビットの平文ブロックを入力としてnビットの暗号文ブロックを出力します。取り得る平文ブロックの組み合わせは複数存在するため、暗号化を可逆(=復号が可能)にするためには、それぞれの平文ブロックが一意の暗号文ブロックへ対応しなければなりません。このような変換は「可逆変換」または「非特異変換」と呼ばれま
-
C#のコメントとは?複数行・単一行コメントの書き方を解説
コメントは、コードの内容や意図を説明するために記述する注釈です。コンパイラはコメント部分を完全に無視するため、プログラムの動作には一切影響しません。C#では、複数行にわたるコメントは「/*」で始まり、「*/」で終わります。 複数行コメント /* 以下はC#における 複数行コメントの例です */ 「/* ... */」で囲まれた範囲はすべてコンパイラによって無視されます。処理の概要や注意点など、複数行にわたる説明を残したい場合に使用します。 単一行コメント // 変数の宣言 int a = 10; 単一行コメントは「//」から行末までがコメントとして扱われます。変数の意味や処理の意図を手軽にメモ