内容のトピック:
アフィン暗号は、単一アルファベット暗号のカテゴリーに分類される、特定の種類の置換暗号を表します。平文内の各文字を 3 つの固定位置数だけシフトする、より有名なシーザー暗号とは異なり、アフィン暗号は 2 つのキー (a と b) を使用します。キーの選択には特別な考慮が必要です。
前提知識
今日のトピックを深く理解するには、次の概念を理解する必要があります。
- 最大公約数 (GCD) と相互素数
- モジュラー演算
これらの概念については、「アフィン暗号の数学的アプローチ」と題された前回の記事で詳しく説明されています。
アフィン暗号方程式
アフィン暗号暗号化の公式から始めましょう。
E(x) = (a.x + b) mod m | |
---|---|
前者) | x アルファベット順のインデックスの暗号化を示します |
ある | 「特別な」最初のキーのインデックス値 |
バツ | 普通文字のインデックス値 |
b | 2番目のキーのインデックス値(追加のシフト値) |
モッドm | アルファベットの合計26の剰余演算 |
代替画像とキャプション : アフィン暗号方程式
たとえば、「BIMANDO」平文を 7 キーと 13 キーを使用して暗号化したいとします。次のテーブル インデックスを使用して、まず平文を対応する数値に変換します。
代替画像とキャプション : インデックス番号付け
「BIMANDO」平文は「1 8 12 0 13 3 14」というインデックス番号に変換されます。
代替画像とキャプション : 平文をインデックス番号値に変換する
次に、方程式計算を適用すると、結果は次のように表示されます。
代替画像とキャプション : アフィン暗号化
したがって、「BIMANDO」平文は、キー 7 と 13 のアフィン暗号を使用して暗号化され、「URTNAIH」になります。
Python を使用したアフィン暗号暗号化
ここで、多数の段落を含む機密メッセージを送信したいとします。アフィン暗号の暗号化を手動で行うと手間も時間もかかり、計算ミスも発生する可能性が高くなりますよね。したがって、アフィン暗号の暗号化プロセスを自動化するプログラムが必要です。以下は、Python プログラムを作成するための段階的なプロセスです。
1. 必要なライブラリをインポートする
私たちのプログラムは、コマンドライン引数の解析、文字列操作、オペレーティング システム関連の機能にそれぞれ必要な argparse、string、os などの必要なモジュールをインポートすることから始まります。
輸入 弦
輸入 あなた
2. アルファベットマッピングの定義
次に、アルファベットを英語の小文字の文字列として定義します。これは、後の暗号化プロセス中に文字をマッピングするために使用されます。
3. アフィン暗号暗号化機能
これが私たちのプログラムの中核となる機能です。入力テキストと 2 つのキー「a」と「b」を受け取り、テキストにアフィン暗号暗号化を適用して、テキストの構造を保持します。
暗号化されたテキスト = 「」
のために チャー で 文章:
もし チャー。 より低い ( ) で アルファベット:
もし チャー。 上です ( ) :
暗号化されたテキスト + = chr ( ( ( * ( 言葉 ( チャー。 より低い ( ) ) - 97 ) +b ) % 26 ) + 65 )
それ以外 :
暗号化されたテキスト + = chr ( ( ( * ( 言葉 ( チャー ) - 97 ) +b ) % 26 ) + 97 )
それ以外 :
4. 条件付きメインチェック
このブロックコードでは、メインプログラムとして実行されているかどうかを確認します。スクリプトとその引数の説明を使用して引数パーサーを設定します。必須の引数はテキスト ファイル入力のパスのみです。出力パスを指定しない場合は、入力ファイル名に「_encrypted」を追加したデフォルトを設定する必要があります。 「keys」引数については、「a,b」にフォーマットする必要があります。ただし、これを設定すると、デフォルトは 5 と 8 になります。
パーサー = 引数解析。 引数パーサー ( 説明 = 「テキストファイルからのアフィン暗号暗号化」 )
パーサー 。 引数の追加 ( '入力ファイル' 、 ヘルプ = 「入力テキストファイルへのパス」 )
パーサー 。 引数の追加 ( 「-k」 、 「--キー」 、 タイプ = str 、 デフォルト = 「5.8」 、 ヘルプ = 「「a,b」形式のアフィン暗号の鍵」 )
引数 = パーサー 。 parse_args ( )
ある 、 b = 地図 ( 整数 、 引数。 キー 。 スプリット ( 「、」 ) )
と 開ける ( 引数。 入力ファイル 、 「r」 ) として ファイル :
文章 = ファイル 。 読む ( )
# 入力ファイルパスからファイル名を抽出します
入力ファイル名 、 拡大 = あなた 。 パス 。 分割テキスト ( 引数。 入力ファイル )
デフォルトの出力ファイル = 入力ファイル名 + 「_暗号化」 +拡張子
# アフィン暗号を使用してテキストを暗号化します
暗号化されたテキスト = アフィン暗号暗号化 ( 文章 、 ある 、 b )
# 暗号化されたテキストを新しいファイルに書き込みます
と 開ける ( デフォルトの出力ファイル 、 'で' ) として ファイル :
ファイル 。 書く ( 暗号化されたテキスト )
最後に、暗号化機能が完了すると、プログラムは入力ファイルと同じファイル拡張子で出力を保存します。
これを「affine_cipher.py」に保存します。次に、次のコマンドを入力してプログラムを実行します。
Python affine_cipher。 パイ -hエラーが見つからなかった場合、出力は次の画像のようになります。
代替画像とキャプション : アフィン暗号 Python プログラム
コンセプトの証明
次の「message.txt」という名前の機密メッセージがあり、それをメンバーにブロードキャストしたいと考えています。
代替画像とキャプション : 平文
したがって、キー 3 と 7 を使用してアフィン暗号を使用してこのメッセージを暗号化する前に作成したプログラムを使用します。コマンドは次のとおりです。
Python affine_cipher。 パイ メッセージ。 TXT -k 3 、 7
代替画像とキャプション : アフィン暗号 Python プログラム
瞬きするほどの速さで、暗号化されたメッセージが正常に作成され、「message_encrypted.txt」に保存されます。メッセージがどのようなものかを確認してみましょう。
代替画像とキャプション : アフィン暗号文
ご覧のとおり、メッセージはスクランブルされています。暗号化方式とそのキーを知っているメンバーだけがメッセージを復号化できます。
自分で試してみる
このプログラムのソース コードを GitHub ページからダウンロードします。 https://github.com/bimando/Affine-Cipher 。
結論
結論として、一文字置換暗号の一種であるアフィン暗号暗号化方式は、2 つのキーを使用することでセキュリティを強化しており、キーの選択には慎重な考慮が必要です。アフィン暗号の複雑さを理解するには、最大公約数 (GCD)、共素数、剰余演算などの概念を理解することが不可欠です。
アフィン暗号方程式 E(x) = (a.x + b) mod m は、暗号化の基本ツールとして機能します。ここで、「a」と「b」はキーを表し、「x」は平文文字のインデックスを表します。アフィン暗号暗号化プロセス用の自動化された Python プログラムの実装は、大規模な暗号化タスクを効率的に合理化するために実証されました。このプログラムには、ライブラリのインポート、アルファベット マッピング、暗号化機能、入力パスと出力パスのコマンド ライン引数の解析などの主要な機能が組み込まれています。特に、このスクリプトではキーと出力ファイル名のデフォルト設定が有効になり、シームレスな暗号化プロセスが容易になります。
よくある質問 (FAQ)
Q1: アフィン暗号とは何ですか?またシーザー暗号との違いは何ですか?
A1: アフィン暗号は、「a」と「b」の 2 つの鍵を使用して暗号化する一文字置換暗号の一種です。対照的に、シーザー暗号は、平文内の各文字に対して 3 つの位置の固定シフトを利用します。
Q2.アフィン暗号を理解するための前提条件は何ですか?
A2: アフィン暗号を完全に理解するには、最大公約数 (GCD)、互いに素数、剰余算術などの概念を理解することが重要です。
Q3: Python でアフィン暗号を使用してメッセージを暗号化するにはどうすればよいですか?
A3: アフィン暗号の暗号化プロセスを自動化するには、この記事で説明されている Python プログラムを利用できます。このプログラムは大規模なテキスト入力を効率的に暗号化し、暗号化手順を簡素化します。この記事では、ライブラリのインポート、アルファベット マッピングの定義、暗号化関数の作成、入力パスと出力パスのコマンド ライン引数の解析について段階的に説明します。