python-ecdsa を使ってみた
class TestEcKey(unittest.TestCase):
def test_generate(self):
from ecdsa import SigningKey, NIST521p
sk = SigningKey.generate(curve=NIST521p)
pri = sk.privkey
pub = pri.public_key
param = dict(
crv=sk.curve,
x=pub.point.x(),
y=pub.point.y(),
d=pri.secret_multiplier)
# Curve
from ecdsa.ellipticcurve import Point, CurveFp
from ecdsa.ecdsa import curve_521
self.assertTrue(isinstance(curve_521, CurveFp))
self.assertTrue(isinstance(param['crv'].curve, CurveFp))
self.assertEqual(curve_521, param['crv'].curve)
self.assertEqual(pub.point.curve(), curve_521)
# Point
p_new = Point(curve_521, param['x'], param['y'])
self.assertEqual(p_new, pub.point)
self.assertTrue(isinstance(pub.point, Point))
# Public Key
from ecdsa.ecdsa import Public_key, generator_521
self.assertEqual(generator_521, pub.generator)
pub_new = Public_key(generator_521, p_new)
# Private Key
from ecdsa.ecdsa import Private_key
pri_new = Private_key(pub_new, param['d'])
# Signature
from ecdsa.ecdsa import string_to_int, Signature
from hashlib import sha512
from uuid import uuid1
rnd = uuid1().int
msg = "hello, it's me."
digest = string_to_int(sha512(msg).digest())
signature_new = pri_new.sign(digest, rnd)
signature_old = pri.sign(digest, rnd)
self.assertTrue(isinstance(signature_new, Signature))
self.assertEqual(signature_new.r, signature_old.r)
self.assertEqual(signature_new.s, signature_old.s)
self.assertEqual(type(signature_new.r), long)
self.assertEqual(type(signature_new.s), long)
#Verify
print pub.verifies(digest, signature_new)
print pub_new.verifies(digest, signature_old)