はじめに
このプロジェクトでは、Python で列置換暗号化アルゴリズムを実装する方法を学びます。列置換暗号化は、入力テキストから形成される行列の列をキーワードに基づいて並び替えることにより平文を暗号化する方法です。
👀 プレビュー
## サンプル 1
text = "welcometolq"; encryption_text = "ct,emlwooleq"
## サンプル 2
text = "welcometolq "; encryption_text = "ct emlwooleq"
## サンプル 3
text = "w"; encryption_text = ",,w,"
## サンプル 4
text = None; encryption_text = None
🎯 タスク
このプロジェクトでは、以下を学びます。
- 列置換暗号化の基本概念
- Python で列置換暗号化アルゴリズムを実装する方法
- サンプル入力を使って暗号化アルゴリズムをテストする方法
🏆 成果
このプロジェクトを完了すると、以下ができるようになります。
- 列置換暗号化の原理を理解する
- Python で列置換暗号化アルゴリズムを実装する
- 列置換暗号化方法を使ってテキストを暗号化および復号化する
列置換暗号化を理解する
このステップでは、列置換暗号化の基本概念とその仕組みを学びます。
列置換暗号化は、平文を 1 行ずつ書き下して、1 行あたりの文字数を固定することで暗号化する方法です(キーの中の一意な文字の数で、通常は繰り返し文字のない単語)。最後の行の文字数が 1 行あたりの固定文字数より少ない場合、その行を埋めるために特殊な記号を使い、行列を形成します。そして、行列の列をキーの中の文字のアルファベット順に並び替えます。最後に、並び替えられた列を 1 つずつ読み取ることで暗号文が得られます。
たとえば、次の平文、キー、埋め文字を考えてみましょう。
平文:welcometolq
キー: qiao
埋め文字:,
- キー
qiaoの長さは 4 です。そして、キーには 26 文字の英文字母のアルファベット順に番号が割り当てられ、順序で先に現れる文字には小さな番号が割り当てられます。qiaoに割り当てられた番号は 4-2-1-3 です。 - 平文は行に分割され、各行は 4 文字(キーの長さ)で構成され、4 列になります。
| 1 | 2 | 3 | 4 |
|---|---|---|---|
| w | e | l | c |
| o | m | e | t |
| o | l | q | , |
- 最後の行に文字が欠けているため、埋め文字を使って埋めます。
- 行列の列の順序をキーのアルファベット順に並び替えます。
| 4 | 2 | 1 | 3 |
|---|---|---|---|
| c | e | w | l |
| t | m | o | e |
| , | l | o | q |
- そして、内容を 1 列ずつ読み取ることで暗号文
ct,emlwooleqが得られます。
列置換暗号化を実装する
このステップでは、Python で列置換暗号化アルゴリズムを実装します。
column_permutation.py ファイルを開き、column_permutation_encryption(text) 関数を探します。この関数は 1 つのテキストを入力として受け取り、キー qiao と埋め文字 ,(コンマ)を使って内容に対して列置換暗号化を行い、暗号文を返します。
実装するコードは以下の通りです。
def column_permutation_encryption(text: str) -> str:
if not text:
return None
key = "qiao"
padding_char = ","
key_order = []
sorted_key = sorted(key)
for i in range(0, len(key)):
key_order.append(sorted_key.index(key[i]))
padded_text = text.ljust(len(key) * ((len(text) - 1) // len(key) + 1), padding_char)
matrix = [
padded_text[i : i + len(key)] for i in range(0, len(padded_text), len(key))
]
encrypted_matrix = [[row[i] for i in key_order] for row in matrix]
encryption_text: str = "".join(
["".join(column) for column in zip(*encrypted_matrix)]
)
return encryption_text
コードを順を追って見ていきましょう。
- まず、入力
textが空かどうかを確認します。空の場合、Noneを返します。 keyを"qiao"と定義し、padding_charを","と定義します。key_orderというリストを作成して、キーの中の文字のアルファベット順を格納します。これはまずキーをソートし、その後ソートされたキーの中の各文字のインデックスを見つけることで行います。- 入力
textにpadding_charを使ってパディングを行い、テキストの長さがキーの長さの倍数になるようにします。 - パディングされたテキストから行列を作成します。ここでは、各行がテキストの 1 行を表し、各列がその行の 1 文字を表します。
- 先に計算した
key_orderに基づいて、行列の列を並び替えます。 - 最後に、並び替えられた列を 1 つずつ読み取り、連結して暗号文を形成します。
列置換暗号化をテストする
列置換暗号化アルゴリズムを実装したので、いくつかのサンプル入力を使ってテストしましょう。
column_permutation.py ファイルの末尾に以下のコードを追加します。
if __name__ == "__main__":
txt = input()
print(column_permutation_encryption(txt))
このコードはユーザーにテキストを入力するよう促し、その後入力されたテキストで column_permutation_encryption() 関数を呼び出し、得られた暗号文を表示します。
ファイルを保存し、ターミナルで以下のコマンドを実行します。
python3 column_permutation.py
いくつかのサンプルテキストを入力し、得られた暗号文を見てみましょう。元のチャレンジで提供された例を参考にすることができます。
## サンプル 1
text = "welcometolq"
encryption_text = "ct,emlwooleq"
## サンプル 2
text = "welcometolq "
encryption_text = "ct emlwooleq"
## サンプル 3
text = "w"
encryption_text = ",,w,"
## サンプル 4
text = None
encryption_text = None
おめでとうございます!Python で列置換暗号化アルゴリズムを成功裏に実装しました。
まとめ
おめでとうございます!このプロジェクトを完了しました。技術力を向上させるために、LabEx でさらに多くの実験を行って練習してください。



