この記事は MicroAd Advent Calendar 2021 の6日目の記事です。
SKAdNetworkで利用されている暗号技術であるECDSA(楕円曲線DSA)暗号を利用したので、鍵の生成、暗号の生成(署名)、暗号の検証までの一連の手順をまとめます。
今回はopenssl
を使うパターンと、Pythonライブラリのcryptgraphy
を使うパターンの2つ記載します。
前書き
以下、P-256曲線を利用している。
opensslを利用する場合
鍵の生成
秘密鍵
$ openssl ecparam -name prime192v1 -genkey -noout -out key.pem
公開鍵
$ openssl ec -in key.pem -pubout -out pubkey.pem
read EC key
writing EC key
署名
メッセージを記入
$ vi message.txt
秘密鍵を使って署名
$ openssl dgst -SHA256 -sign key.pem message.txt > signature.dat
鍵の検証
$ openssl dgst -SHA256 -verify pubkey.pem -signature signature.dat message.txt
Verified OK
cryptographyを利用する場合
import base64
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.exceptions import InvalidSignature
YOUR_PRIVATE_KEY = 'XXXXX'
YOUR_PUBLIC_KEY = 'XXXXX'
MESSAGE = 'abc'
pri_key = f"""-----BEGIN EC PRIVATE KEY-----\n{YOUR_PRIVATE_KEY}\n-----END EC PRIVATE KEY-----"""
pub_key = f"""-----BEGIN PUBLIC KEY-----\n{YOUR_PUBLIC_KEY}\n-----END PUBLIC KEY-----"""
private_key_ins = serialization.load_pem_private_key(pri_key.encode(), password=None)
public_key_ins = serialization.load_pem_public_key(pub_key.encode())
# private keyでシグネチャ生成
signature = private_key_ins.sign(signature_algorithm=ec.ECDSA(hashes.SHA256()), data=MESSAGE.encode())
attribution_signature = base64.b64encode(signature)
print('original message:', MESSAGE)
print('attribution_signature:', attribution_signature.decode())
# public keyでシグネチャ検証
try:
public_key_ins.verify(signature, MESSAGE.encode(), ec.ECDSA(hashes.SHA256()))
print('signature OK.')
except InvalidSignature:
print('signature NG.')
※ YOUR_PRIVATE_KEY
, YOUR_PUBLIC_KEY
は各自で発行したものに置き換える
実行結果
$ python script.py
original message: abc
attribution_signature: (省略)
signature OK.