🌏

電子署名関連チュートリアル(Python、ECDSA)

に公開

今日は、電子署名関連のチュートリアルを書こーと思います。
言語は Python、公開鍵暗号方式のライブラリは ecdsa(楕円曲線暗号:ビットコインと同じ?)を使います。
PyPI:https://pypi.org/project/ecdsa/

今回やること

  1. インストール
  2. インポート
  3. 秘密鍵、公開鍵を作成
  4. 文書を用意、電子署名を作成
  5. 電子署名の検証

環境

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