- シーザー暗号は、ジュリアス・シーザーが同盟者に秘密のメッセージを送信するために使用した単純な暗号化技術です。これは、プレーンテキスト メッセージ内の文字を、シフトまたはキーと呼ばれる特定の位置数だけシフトすることによって機能します。
- シーザー暗号技術は、暗号化技術の最も初期かつ最も単純な方法の 1 つです。これは単なる置換暗号の一種です。つまり、特定のテキストの各文字が、アルファベットの下の固定数の位置を持つ文字に置き換えられます。たとえば、シフトが 1 の場合、A は B に置き換えられ、B は C になります。この方法は明らかにジュリアス・シーザーにちなんで名付けられ、彼は役人たちと通信するためにそれを使用したようです。
- したがって、特定のテキストを暗号化するには、テキストの各文字が下に移動された位置の数を示すシフトとして知られる整数値が必要です。
暗号化は、A = 0、B = 1、…、Z = 25 というスキームに従って、最初に文字を数字に変換することにより、モジュラー算術を使用して表すことができます。シフト n による文字の暗号化は、数学的に次のように記述できます。 - たとえば、シフトが 3 の場合、文字 A は文字 D に置き換えられ、B は E になり、C は F になります。アルファベットは、Z の後に A に戻るように折り返されます。
- 以下は、シーザー暗号を使用してメッセージ HELLO をシフト 3 で暗号化する方法の例です。
- 平文メッセージを書き留めます: HELLO
- シフト値を選択します。この場合、シフト 3 を使用します。
- 平文メッセージ内の各文字を、アルファベットの 3 つ右の文字に置き換えます。
H が K になります (H から 3 をシフト)
E が H になります (E から 3 をシフト)
LがOになる(Lから3シフト)
パンダメルト
LがOになる(Lから3シフト)
O が R になります (O から 3 をシフト)
4.暗号化されたメッセージは KHOOR になりました。
- メッセージを復号化するには、各文字を同じ位置数だけ後方にシフトするだけです。この場合、KHOOR の各文字を 3 桁後ろにシフトして、元のメッセージ HELLO を取得します。
(シフトnの暗号化フェーズ)
(シフト n による復号化フェーズ)
私のモニターのサイズは何ですか

例:
JavaはCSVを読み取ります
Text : ABCDEFGHIJKLMNOPQRSTUVWXYZ Shift : 23 Cipher : XYZABCDEFGHIJKLMNOPQRSTUVW Text : ATTACKATONCE Shift : 4 Cipher : EXXEGOEXSRGI>
利点:
- そのため、実装と使用が簡単で、初心者が暗号化について学ぶのに適しています。
- 回転ディスクのセットやスキュテールとして知られるカードのセットなど、物理的に実装でき、特定の状況で役立ちます。
- 必要な事前共有情報は少数のみです。
- 複数のシフト値やキーワードを使用するなど、より安全なバリアントを作成するために簡単に変更できます。
短所:
- 最新の復号化方法に対しては安全ではありません。
- 攻撃者が同じメッセージの暗号化されたバージョンと暗号化されていないバージョンの両方にアクセスできる既知の平文攻撃に対して脆弱です。
- 使用可能なキーの数が少ないということは、攻撃者が正しいキーが見つかるまですべての使用可能なキーを簡単に試すことができ、ブルート フォース攻撃に対して脆弱になることを意味します。
- 解読されやすいため、長いテキストの暗号化には適していません。
- 壊れやすいため、安全な通信には適していません。
- メッセージの機密性、完全性、および信頼性は提供されません。
シーザー暗号の特徴:
- 置換暗号: シーザー暗号は置換暗号の一種で、平文内の各文字がアルファベットの下の固定数の位置の文字に置き換えられます。
- 固定キー: シーザー暗号では、文字がシフトされる位置の数である固定キーが使用されます。このキーは送信者と受信者の両方に知られています。
- 対称暗号化: シーザー暗号は対称暗号化技術であり、暗号化と復号化の両方に同じキーが使用されることを意味します。
- 限られたキースペース: 英語のアルファベットには 26 文字しかないため、シーザー暗号では使用可能なキースペースが 26 個のみという非常に限られたキースペースしかありません。
- ブルート フォース攻撃に対して脆弱: シーザー暗号は、試行可能な鍵が 26 個しかないため、ブルート フォース攻撃に対して脆弱です。
- 実装が簡単: Caesar 暗号は実装が非常に簡単で、必要なのは単純な算術演算のみであるため、単純な暗号化タスクによく使用されます。
シーザー暗号のルール:
- 1 ~ 25 の数値を選択してください。これがシフト値になります。
- アルファベットをAからZまで順番に書きます。
- アルファベットの各文字をシフト値だけシフトします。たとえば、シフト値が 3 の場合、A は D、B は E、C は F になります。
- 各文字を対応するシフトされた文字に置き換えて、メッセージを暗号化します。たとえば、シフト値が 3 の場合、hello という単語は khoor になります。
- メッセージを復号化するには、各文字を同じ量だけシフトして戻すことにより、プロセスを逆に行うだけです。たとえば、シフト値が 3 の場合、暗号化されたメッセージ khoor は hello になります。
シーザー暗号のアルゴリズム:
入力:
- 1 ~ 25 の間のシフト値を選択します。
- アルファベットをAからZまで順番に書きます。
- 元のアルファベットの各文字をシフト値だけシフトして、新しいアルファベットを作成します。たとえば、シフト値が 3 の場合、新しいアルファベットは次のようになります。
- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C - メッセージの各文字を新しいアルファベットの対応する文字に置き換えます。たとえば、シフト値が 3 の場合、hello という単語は khoor になります。
- メッセージを復号化するには、各文字を同じ量だけ後ろにシフトします。たとえば、シフト値が 3 の場合、暗号化されたメッセージ khoor は hello になります。
手順:
- 指定されたテキストを一度に 1 文字ずつ調べます。
- 文字ごとに、テキストを暗号化するか復号化するかに応じて、ルールに従って指定された文字を変換します。
- 生成された新しい文字列を返します。
Text (文字列) と Shift 値 (整数) を受け取り、暗号化されたテキストを返すプログラム。
C++
// A C++ program to illustrate Caesar Cipher Technique> #include> using> namespace> std;> // This function receives text and shift and> // returns the encrypted text> string encrypt(string text,>int> s)> {> >string result =>''>;> >// traverse text> >for> (>int> i = 0; i // apply transformation to each character // Encrypt Uppercase letters if (isupper(text[i])) result += char(int(text[i] + s - 65) % 26 + 65); // Encrypt Lowercase letters else result += char(int(text[i] + s - 97) % 26 + 97); } // Return the resulting string return result; } // Driver program to test the above function int main() { string text = 'ATTACKATONCE'; int s = 4; cout << 'Text : ' << text; cout << '
Shift: ' << s; cout << '
Cipher: ' << encrypt(text, s); return 0; }> |
>
>
ジャワ
//A Java Program to illustrate Caesar Cipher Technique> class> CaesarCipher> {> >// Encrypts text using a shift of s> >public> static> StringBuffer encrypt(String text,>int> s)> >{> >StringBuffer result=>new> StringBuffer();> >for> (>int> i=>0>; i { if (Character.isUpperCase(text.charAt(i))) { char ch = (char)(((int)text.charAt(i) + s - 65) % 26 + 65); result.append(ch); } else { char ch = (char)(((int)text.charAt(i) + s - 97) % 26 + 97); result.append(ch); } } return result; } // Driver code public static void main(String[] args) { String text = 'ATTACKATONCE'; int s = 4; System.out.println('Text : ' + text); System.out.println('Shift : ' + s); System.out.println('Cipher: ' + encrypt(text, s)); } }> |
>
>
Python3
#A python program to illustrate Caesar Cipher Technique> def> encrypt(text,s):> >result>=> ''> ># traverse text> >for> i>in> range>(>len>(text)):> >char>=> text[i]> ># Encrypt uppercase characters> >if> (char.isupper()):> >result>+>=> chr>((>ord>(char)>+> s>->65>)>%> 26> +> 65>)> ># Encrypt lowercase characters> >else>:> >result>+>=> chr>((>ord>(char)>+> s>-> 97>)>%> 26> +> 97>)> >return> result> #check the above function> text>=> 'ATTACKATONCE'> s>=> 4> print> (>'Text : '> +> text)> print> (>'Shift : '> +> str>(s))> print> (>'Cipher: '> +> encrypt(text,s))> |
>
>
C#
// A C# Program to illustrate Caesar Cipher Technique> using> System;> using> System.Text;> public> class> CaesarCipher> {> >// Encrypts text using a shift on s> >public> static> StringBuilder encrypt(String text,>int> s)> >{> >StringBuilder result=>new> StringBuilder();> >for> (>int> i=0; i { if (char.IsUpper(text[i])) { char ch = (char)(((int)text[i] + s - 65) % 26 + 65); result.Append(ch); } else { char ch = (char)(((int)text[i] + s - 97) % 26 + 97); result.Append(ch); } } return result; } // Driver code public static void Main(String[] args) { String text = 'ATTACKATONCE'; int s = 4; Console.WriteLine('Text : ' + text); Console.WriteLine('Shift : ' + s); Console.WriteLine('Cipher: ' + encrypt(text, s)); } } /* This code contributed by PrinciRaj1992 */> |
>
>
PHP
// A PHP program to illustrate Caesar // Cipher Technique // This function receives text and shift // and returns the encrypted text function encrypt($text, $s) { $result = ''; // traverse text for ($i = 0; $i |
>
>
JavaScript
> //A Javascript Program to illustrate Caesar Cipher Technique> > >// Encrypts text using a shift on s> >function> encrypt(text, s)> >{> >let result=>''> >for> (let i = 0; i { let char = text[i]; if (char.toUpperCase(text[i])) { let ch = String.fromCharCode((char.charCodeAt(0) + s-65) % 26 + 65); result += ch; } else { let ch = String.fromCharCode((char.charCodeAt(0) + s-97) % 26 + 97); result += ch; } } return result; } // Driver code let text = 'ATTACKATONCE'; let s = 4; document.write('Text : ' + text + ' '); document.write('Shift : ' + s + ' '); document.write('Cipher: ' + encrypt(text, s) + ' '); // This code is contributed by avanitrachhadiya2155> |
>
>
出力
Text : ATTACKATONCE Shift: 4 Cipher: EXXEGOEXSRGI>
時間計算量: O(N) (N は指定されたテキストの長さ)
補助スペース: の上)
開発者モードを無効にする
復号化する方法は?
encrypt と同様の別の関数 decrypt を作成することもできます。これは、指定されたシフトを逆方向に適用して元のテキストを復号化します。ただし、モジュロの下で暗号の循環特性を使用できるため、単純に観察できます。
Cipher(n) = De-cipher(26-n)>
したがって、同じ関数を使用して復号化することができますが、代わりに、shift = 26-shift になるようにシフト値を変更します (C++ でのサンプル実行については、これを参照してください)。