Python で列置換暗号化を実装する

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、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

埋め文字:,

  1. キー qiao の長さは 4 です。そして、キーには 26 文字の英文字母のアルファベット順に番号が割り当てられ、順序で先に現れる文字には小さな番号が割り当てられます。qiao に割り当てられた番号は 4-2-1-3 です。
  2. 平文は行に分割され、各行は 4 文字(キーの長さ)で構成され、4 列になります。
1 2 3 4
w e l c
o m e t
o l q ,
  1. 最後の行に文字が欠けているため、埋め文字を使って埋めます。
  2. 行列の列の順序をキーのアルファベット順に並び替えます。
4 2 1 3
c e w l
t m o e
, l o q
  1. そして、内容を 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

コードを順を追って見ていきましょう。

  1. まず、入力 text が空かどうかを確認します。空の場合、None を返します。
  2. key"qiao" と定義し、padding_char"," と定義します。
  3. key_order というリストを作成して、キーの中の文字のアルファベット順を格納します。これはまずキーをソートし、その後ソートされたキーの中の各文字のインデックスを見つけることで行います。
  4. 入力 textpadding_char を使ってパディングを行い、テキストの長さがキーの長さの倍数になるようにします。
  5. パディングされたテキストから行列を作成します。ここでは、各行がテキストの 1 行を表し、各列がその行の 1 文字を表します。
  6. 先に計算した key_order に基づいて、行列の列を並び替えます。
  7. 最後に、並び替えられた列を 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 でさらに多くの実験を行って練習してください。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習