🗺️
【Python-Fire】サブコマンド作成し、暗号化したファイルの出力、復号化
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に関しての参照:
Python-fireに関して参考したサイト:
Discussion