🗺️

【Python-Fire】サブコマンド作成し、暗号化したファイルの出力、復号化

2022/07/28に公開

Pythonの仮想環境 venvに入り
Python-Fireをインストールします。

$ pip install fire

RSA のアルゴリズムを Python で実装し、実際に平文 (テキスト) を暗号化して、さらに暗号文を復号してみます。

my_rsa.py

from math import gcd

def lcm(p, q):
    return (p * q) // gcd(p, q)


def generate_keys(p, q):
    N = p * q
    L = lcm(p - 1, q - 1)

    for i in range(2, L):
        if gcd(i, L) == 1:
            E = i
            break

    for i in range(2, L):
        if (E * i) % L == 1:
            D = i
            break

    return (E, N), (D, N)


def encrypt(plain_text, public_key):
    E, N = public_key

    # Pythonのリストの内包表記
    # plain_text の中身をforで回してる
    # ord = unicode(=32bit)に変換する関数
    # 一行でリスト作成してくれてる
    # ordの1つずつ取得した結果をplain_integersに入れる

    plain_integers = [ord(char) for char in plain_text]

    # plain_integers を pow関数 に入れて
    # iはi文字目
    
    encrypted_integers = [pow(i, E, N) for i in plain_integers]

    # unicodeをchrに変えてる
    # join 文字列結合している
    
    encrypted_text = ''.join(chr(i) for i in encrypted_integers)


    return encrypted_text


def decrypt(encrypted_text, private_key):
    D, N = private_key
    encrypted_integers = [ord(char) for char in encrypted_text]
    decrypted_intergers = [pow(i, D, N) for i in encrypted_integers]
    decrypted_text = ''.join(chr(i) for i in decrypted_intergers)

    return decrypted_text
    

my_rsa.pyをインポートします。

app.py

import fire
from my_rsa import encrypt as RSAEncrypt, generate_keys
from my_rsa import decrypt as RSADecrypt

# 2個の引数を受け取る
public_key, private_key = generate_keys(101, 3259)

class Command:

    def encrypt(self):
	# ここのテキストを暗号化してくれる
        data = RSAEncrypt("暗号化するど", public_key)

        # with構文だと、closeを勝手にしてくれる
        # 'w' = 書き込み
        with open('print_text.txt', 'w') as f:
            print(data, file=f)

        # ここで終わりの意味 
        pass

    def decrypt(self):
        # 'r' = 読み込み
        with open('print_text.txt', 'r') as f
	    # 
            v = RSADecrypt(f.read(), private_key)
            print(v)

        # ここで終わりの意味
        pass


if __name__ == "__main__":
    fire.Fire(Command)

RSAに関しての参照:

https://qiita.com/QUANON/items/e7b181dd08f2f0b4fdbe

Python-fireに関して参考したサイト:

https://qiita.com/SaitoTsutomu/items/a5eb827737c9d59af2af

Discussion