LoginSignup
1
1

More than 1 year has passed since last update.

【Python】公開鍵で暗号化した文字列を秘密鍵で復号化する方法

Posted at

はじめに

システム外で暗号化したパスワードをシステム内で復号化して利用したい というニッチな要望に応える記事です。
英語サイト含めまともな情報が少なく、最終的にあまり見ないであろう方法で動作しました。
人に説明できるほど暗号化技術に詳しくないため、備忘録がてら以下で手順のみ書いていきます。

手順

1. キーペアを作成する

# 秘密鍵生成
openssl genrsa 2048 > private-key.pem

# 秘密鍵をPKCS#8に変換
openssl pkcs8 -topk8 -in private-key.pem -inform PEM -out private-key_pkcs8.pem -outform PEM -noiter -nocrypt

# 公開鍵を生成
openssl rsa -in private-key_pkcs8.pem -pubout -out public-key.pem

※ ファイル内の改行コードを取り除いておく。
※ この時点で public-key.pem は不要になる。

2. システム外で平文を暗号化する

システム外、つまり手動で暗号化したかったため、下記のサイトを利用しました。
https://www.devglan.com/online-tools/rsa-encryption-decryption

公開鍵はコピペして、Cipher Typeを適切に設定し、Encryptします。
Encrypted Outputがシステムに読ませて復号化すべき文字列です。

2021-10-24_05h36_16.jpg

3. プログラム内で復号化する

!pip install pycryptodome

import base64
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

encoded_encrypted_pw = "上記サイトで暗号化したパスワード"

key = RSA.importKey(open("private-key_pkcs8.pem", "r").read())
decryptor = PKCS1_OAEP.new(key)

decoded_encrypted_pw = base64.b64decode(encoded_encrypted_pw)
decrypted_encoded_pw = decryptor.decrypt(decoded_encrypted_pw)
decrypted_pw = decrypted_encoded_pw.decode("utf-8")

print(f"type(pw): {type(decrypted_pw)}", f"pw: {decrypted_pw}", sep="\n")

# 出力
# type(pw): <class 'str'>
# pw: password

以上です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1