- シーザー暗号は、キーによって定義された一定数の位置だけずらした別の文字で各文字を置き換えます。
- C では、文字を数値コードに変換し、合計と 26 の剰余を適用し、大文字と小文字を尊重することによって実装されます。
- isalpha、isupper、islower、strlen などの機能とモジュール設計により、暗号化、復号化、ブルートフォース攻撃を行う対話型プログラムが容易になります。
- これは歴史的には重要ですが、暗号としては弱いアルゴリズムであり、教育および学習の練習に最適です。 プログラミング.

C言語を初めて使い、実用的なプロジェクトを希望する場合は、 シーザー暗号を使用して暗号化および復号化するためのプログラムを作成します。 これは完璧な選択肢です。シンプルで、文字列を操作したり、文字を扱ったり、数学的な思考を強いられますが、複雑さに頭を悩ませることはありません。
プログラミングの練習としてだけでなく、 シーザー暗号は暗号の世界への素晴らしい入門書である鍵とは何か、なぜ一部のシステムが脆弱なのか、そしてブルートフォース攻撃で暗号を攻撃する方法を理解します。理論、例、そしてC言語での実装方法をいくつか紹介しながら、段階的に解説していきます。
シーザー暗号とは何ですか?どこから来たのですか?
呼び出し シーザー暗号シフト暗号は、現存する最も古い暗号システムの一つです。その名前は ジュリアス·シーザー彼はこれを使って指揮を執ったと言われている 偽装された軍事メッセージ 誰かがその文書を傍受したとしても一目では理解できないように、将軍たちに伝えた。
アイデアは非常にシンプルです。 元のメッセージの各文字は、アルファベットの一定数だけ前方または後方にある別の文字に置き換えられます。そのポジションの数は クラベスたとえば、キー 3 では、A は D に、B は E に、C は F になり、Z まで続きます。Z でアルファベットは「反転」し、再び A から始まります。
この計画は、 単一アルファベット置換暗号平文中に同じ文字が出現するたびに、同じ暗号化文字に変換されます。そのため、理解と実装は非常に容易ですが、少し解析すれば簡単に解読されてしまいます。

シーザー暗号の数学的基礎
この古典的な方法の背後には 非常に簡潔な数学的定式化. 各文字に0からn-1までの番号を付けました (ここで n はアルファベットのサイズ)、暗号は次のように表現できます。
C = (P + k) mod n
どこ P 元の文字の位置、 C 暗号化された文字の位置、 k 避難の鍵であり、 n は、 シンボル アルファベットの26番目(ñを除く英語のアルファベットでは26番目)。演算子 MOD これにより、アルファベットの最後まで達すると、最初からカウントが再開されます。
メッセージを取得するには、 操作を逆にする:
P = (C − k) mod n
実際には、Cで実装する際には抽象的な位置を扱うのではなく、 文字数値コード(ASCIIまたはUTF-8互換)大文字のAからZは65から90までの値を占め、小文字のaaからzは97から122までの範囲を占めます。これらの範囲を利用して、基本コード(「A」または「a」)を減算し、26を法としてシフトを適用し、基本コードを加算し直すことができます。
重要な詳細: モジュラー操作はアルファベットの「循環効果」を保証する大文字の範囲でキー 3 を使用して Z を 3 桁シフトすると、計算は 0 ~ 25 の範囲内で実行され、その後 ASCII コードに変換されるため、結果は C になります。
必要な基本的な暗号化の概念
シーザー暗号を使うことで、いくつかの 古典的な暗号の概念 まだ高度な数学や最新のアルゴリズムには触れていません。
元の暗号化されていないメッセージを プレーンテキストこれはあなたが伝えたい内容です。例えば「さようなら」や完全なフレーズなどです。暗号化を適用した結果は 暗号文 o 暗号文これは、「Dglrv」のような意味のない文字列のように見えます。
平文を暗号文に変換するプロセスは 暗号化、その逆の操作は 復号化どちらの場合も、 クラベスシーザー暗号では、これは単純に1から26までの整数(プログラムでの定義方法によっては0から25まで)であり、次のようなサービスに応用されている。 Gmailの.
興味深い点は、知識のないユーザーにとっては結果が安全に見えるかもしれないが、 シーザー暗号の実際のセキュリティは実質的にゼロです。標準的なラテンアルファベットでは 25 個のキーしか使用できないため、攻撃者はブルートフォース プログラムを使用して数ミリ秒以内にすべてのキーを試すことができます。

ASCII、序数、文字と数字の変換
このシステムをC言語で実装するには、 コンピュータが文字を表現する方法歴史的には、各シンボルに 0 から 127 までの整数を割り当てる ASCII が主に使用されていましたが、実際には 32 から 126 までの印刷可能な範囲が主に使用されています。
すでにコメントしているように、 大文字のAZは65から90までのコードを持っています、そして、 97から122までの小文字のaz0〜9の数字の範囲は48〜57です。現在ではUTF-8で作業するのが一般的ですが、基本文字についてはASCIIと同じ値が維持されるため、コードは引き続き有効です。
通常のトリックは 文字を数字コードに変換するその数値を加算、減算、剰余演算で操作し、文字に戻します。 Python これは関数で行われます 順序() y chr(); Cではそのようなものは存在しませんが、 char型自体は整数として扱うことができる「A」や「a」などの文字定数は数値として機能します。
たとえば、C で文字「A」を 3 つ前に移動するには、次のように考えます。 「A」のコードは65で、3を足すと68となり、「D」に相当します。大文字を扱うときは、まず「A」を減算して範囲を 0 ~ 25 に正規化し、オフセット モジュロ 26 を適用してから、「A」を加算して正しいコードを復元します。
シーザー暗号のCプログラムの一般的な設計
シーザー暗号化と復号化を実装するCプログラムは、通常、常に 非常に似た構造ただし、詳細は著者のスタイルに応じて変更される可能性があります。
- ユーザーからのテキストのリクエスト: 暗号化または復号化されるメッセージとなる文字列が要求されます。
- 数字キーの読み取り: ユーザーはオフセットを入力します。通常は 1 ~ 26 の整数です。
- モード選択: 暗号化、復号化、さらにはブルート フォース攻撃など、追加の機能も提供します。
- メイン翻訳機能: メッセージ、キー、モードを受け取り、文字列を走査して処理結果を生成します。
- 画面出力復元された暗号文または平文が印刷されます。
アルゴリズムの中核は常に同じです。 文字列を文字ごとに走査します。各記号が文字かどうかを確認し、大文字と小文字を区別して適切な変換を適用します。文字以外のもの(スペース、句読点、数字など)は通常、そのまま残されます。

標準C関数を使用して文字を操作する
コードをよりクリーンかつ堅牢にするには、ヘッダーを利用することを強くお勧めします。 は、文字を分類するための非常に便利な機能をいくつか提供します。
Funcionesクレーブ:
特に、シーザー暗号については、次の点に特に興味があるでしょう。
- isalpha(c): c が文字 (大文字または小文字) の場合は 0 以外の値を返し、それ以外の場合は 0 を返します。
- isupper(c): c が大文字かどうかを確認します。
- islower(c): c が小文字かどうかを確認します。
Con estas funciones puedes 処理する文字を簡単にフィルタリングisalpha(c) が偽の場合、シンボルを結果にコピーして次のシンボルに進みます。文字の場合は、isupper または islower に応じて適切な範囲(AZ または az)を決定し、対応するアルファベットの範囲外になる心配なくシフトを適用します。
並行して、ヘッダーも必要になります 次のような機能の場合 strlen()これにより、文字列の長さを知ることができ、ループで使用することができます。 の o while メッセージを反復処理することによって。
C言語での基本的なシーザー暗号の実装例
Cプログラムの非常に一般的なバージョンでは、例えば次のように呼び出すことができる関数が定義されています。 停止()担当 受信した文字列をその場で変換する または、入力バッファから暗号化されたコピーを生成します。
典型的なフロー:
- En メイン()ユーザーは処理するテキストを要求されます。
- 変位キーが要求され、それが許容範囲内であることを確認するために検証されます。
- 暗号化関数は、テキストとキーを渡すことによって呼び出されます。
- 結果が画面に表示されます。
内部構造:
- strlen()を使用してテキストの長さを計算する ループ制限を設定します。
- 整数インデックスを使用して、文字列を文字ごとに移動します。
- 各文字が大文字か小文字か、またはアルファベット以外かを確認します。
- 適切な数式と % 演算子 26 を使用して変位を適用します。
- アルファベット以外の文字は変更しないでください。
オペレーターの使用 26% 結果には不可欠である アルファベット順にしたがって、キー 3 を使用して z をシフトすると、奇妙な ASCII コード シンボルの代わりに c が表示されます。
C言語での文字列操作: scanf、fgets、buffers
C言語でこれらのプログラムを書く上で最も難しい点の一つは暗号化そのものではなく、 標準入力から文字列を読み取る方法「%s」を使用した `scanf` は魅力的に見えますが、いくつかの問題があります。最初のスペースで読み取りが中断され、バッファ サイズが適切に制御されず、注意しないとオーバーフローが発生しやすくなります。
そのため、多くの現代の例では、 fgets() 行全体を読み込む。この関数はバッファ、その最大サイズ、そして入力ソース(通常はstdin)を受け取り、制限を超えないことを保証する。トレードオフとして、 通常、文字列の最後に改行が残りますしたがって、通常は、文字列を調べて '\n' が見つかったら '\0' に置き換えて手動でクリーンアップすることをお勧めします。
いずれにしても、暗号化アルゴリズムは文字列の取得方法とは無関係です。 事前に用意されたchar[]を受け取る関数にCaesarのロジックをカプセル化することができます。次に、main で、必要に応じて、その配列を fgets、scanf、またはその他の方法で埋めるかどうかを決定します。

完全なインタラクティブプログラムの構造
基本的な暗号化機能を超えて、 かなり包括的なインタラクティブプログラム これにより、ユーザーは暗号化するか、復号化するか、あるいはすべての可能なキーを試すか (ブルート フォース モード) を選択できます。
非常に明確な構成は、ロジックをいくつかの機能に分割することで構成されます。
- 取得モード(): ユーザーに暗号化、復号化、またはブルート フォースを使用するかどうかを尋ね、選択されたモードを表す文字または短い文字列を返します。
- 取得メッセージ(): 処理するテキストを要求し、それを返す役割を担います。
- getKey(): ユーザーにキーを要求し、1 から最大値 (たとえば 26) までの値を入力するように強制し、その整数を返します。
- getTranslatedMessage(モード、メッセージ、キー): モードに応じて暗号化または復号化ロジックを適用し、変換されたテキストを返します。
復号モードでは非常に便利です 暗号化と同じ機能で動作しますただし、鍵の符号は変更されます。つまり、ユーザーが復号を選択した場合、鍵は-1倍され、暗号化に使用されたのと同じアルゴリズムが適用されます。これにより、コードの重複を回避できます。
ブルートフォース モードでは、注目すべき興味深い点が追加されます。 すべての可能なキーをテストするプロセスを自動化しますこのプログラムは1から最大キーサイズまでループし、各反復処理で復号モードで翻訳関数を呼び出し、結果と使用されたキーを表示します。ユーザーは、スペイン語で意味を成す行を観察するだけで、元々どのシフトが使用されていたかを推測できます。
#含む// printfとscanfの場合 #include // strlenの場合 // シーザー暗号を適用する関数 void caesar_cipher(char *text, int shift) { for (int i = 0; i < strlen(text); i++) { char c = text[i]; // 現在の文字 // 大文字の場合 if (c >= 'A' && c <= 'Z') { text[i] = ((c - 'A' + shift) % 26) + 'A'; } // 小文字の場合 else if (c >= 'a' && c <= 'z') { text[i] = ((c - 'a' + shift) % 26) + 'a'; } // 文字でない場合はそのままにする } } int main() { char message[100]; // テキスト用のバッファ int shift; // シフトの値 printf("暗号化するメッセージを入力してください: "); scanf("%99[^\n]", message); // スペースを含む最大 99 文字を読み取ります printf("オフセットを入力してください (例: 3): "); scanf("%d", &offset); // 暗号化を適用します caesar_cipher(message, offset); printf("暗号化されたメッセージ: %s\n", message); return 0; }
大文字、小文字、特殊文字の扱い
最初に見落とされがちなのは、 文字の形を尊重し、テキストを壊さないでください優れたシーザー暗号プログラムは、大文字と小文字を別々に扱い、アルファベットに属さない記号をそのまま残す必要があります。
典型的な論理 次のとおりです。
- シンボルがチェックに合格しない場合 isalpha()変更されずに結果に直接コピーされます。
- 大文字の場合は 'A'を減算して値を正規化する変位は 26 を法として適用され、その後 'A' が再度加算されます。
- 小文字の場合も同様に行われますが、範囲は 'a' に基づいて決定されます。
- キーを追加したときに範囲を超える場合 (「Z」または「z」を超える場合) は 26 を減算します。減算したときに範囲を下回る場合は 26 を加算します。
この方法では、キー3で「さようなら」のようなテキストを 「Dglrv」は頭文字を大文字、残りは小文字で表記します。解読すると元の文字に戻ります。
また、次のことを認識しておくことも重要です。 シーザー暗号はスペースや句読点を変更しないこれにより、文章や段落の視覚的な構造は維持されますが、メッセージの長さと単語の相対的な位置は攻撃者に見えてしまいます。
バイトの世界とテクノロジー全般についての情熱的なライター。私は執筆を通じて自分の知識を共有するのが大好きです。このブログでは、ガジェット、ソフトウェア、ハードウェア、技術トレンドなどについて最も興味深いことをすべて紹介します。私の目標は、シンプルで楽しい方法でデジタル世界をナビゲートできるよう支援することです。