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