🌏
電子署名関連チュートリアル(Python、ECDSA)
今日は、電子署名関連のチュートリアルを書こーと思います。
言語は Python、公開鍵暗号方式のライブラリは ecdsa(楕円曲線暗号:ビットコインと同じ?)を使います。
PyPI:https://pypi.org/project/ecdsa/
今回やること
- インストール
- インポート
- 秘密鍵、公開鍵を作成
- 文書を用意、電子署名を作成
- 電子署名の検証
環境
Windows10、VSCode
1. インストール
コマンド・プロンプト
pip install ecdsa
2. インポート
signature.py
import binascii
from ecdsa import SigningKey, VerifyingKey, SECP256k1, BadSignatureError
3. 秘密鍵、公開鍵を作成
通信でのやり取りを想定して、鍵は文字列化します。
signature.py
secret_key = SigningKey.generate(curve=SECP256k1)
public_key = secret_key.verifying_key
secret_key_str = secret_key.to_string().hex()
public_key_str = public_key.to_string().hex()
print('秘密鍵文字列長:', len(secret_key_str))
print('秘密鍵文字列:', secret_key_str)
print('公開鍵文字列長:', len(public_key_str))
print('公開鍵文字列:', public_key_str)
実行
4. 文書、電子署名を作成
sigunature.py
documents = '文書'
# 電子署名
signature_str = secret_key.sign(documents.encode('utf-8')).hex()
print('電子署名文字列長:', len(signature_str))
print('電子署名文字列:', signature_str)
実行
5. 電子署名の検証
改ざんを試す場合は、コメント改ざん下のコメント・アウトを外します。
(公開鍵と秘密鍵は文字列からの復元方法が違います)
sigunature.py
# 文字列から公開鍵と電子署名を復元
public_key = VerifyingKey.from_string(binascii.unhexlify(public_key_str), curve=SECP256k1)
print('公開鍵の型:', type(public_key))
signature = binascii.unhexlify(signature_str)
print('電子署名の型:', type(signature))
# 参考:文字列から秘密鍵を復元
secret_key = SigningKey.from_string(binascii.unhexlify(secret_key_str), curve=SECP256k1)
print('秘密鍵の型:', type(secret_key))
# 改ざん
# documents = '文書改'
# 電子署名を検証
try:
public_key.verify(signature, documents.encode('utf-8'))
print("文書は改ざんされていません")
except BadSignatureError as e:
print("文書が改ざんされています")
print(e)
実行
改ざん実行
以上になります!ありがとうございましたー♪
Discussion