LoginSignup
2
5

More than 5 years have passed since last update.

Python:ECDSAのキー生成と署名検証の確認(P-521/SHA-512)

Last updated at Posted at 2014-02-27

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)

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5