练习:ECDSA 签名与验证
在本练习中,我们将使用 ECDSA 数字签名算法和 NIST P-521 曲线对消息进行签名和验证。NIST P-521 椭圆曲线也称为 secp521r1,是一条适用于 ECDSA 数字签名和 ECDH 密钥协商的 521 位 ECC 曲线。它使用 521 位私钥(编码为 65-66 字节、130-132 个十六进制数字)和 1042 位公钥(未压缩,编码为 130-131 字节、260-261 个十六进制数字)。生成的签名为 132 字节(264 个十六进制数字)。
使用 ECDSA/P-521 签署消息
编写程序,使用给定私钥对消息进行签名。输入由 2 行文本组成:消息和私钥。消息以文本形式给出,私钥以十六进制字符串形式给出(130-132 个十六进制数字)。使用确定性 ECDSA 签名(遵循 RFC 6979)和 NIST P-521 曲线(也称为 secp521r1)。以 JSON 文档形式打印输出,其中包含输入消息、签名者的公钥(未压缩的十六进制字符串)和 ECDSA 数字签名(十六进制字符串)。
输入示例:
Message for ECDSA-NIST-521p signing
00135799f9d1f033af26168780bf2503313acff854c44031321d7a29bba96edb3c1b93b9deea55229b1de058196ad69a79c01463e3281d9fcc82afd73aac7fdfa4af
输出示例:
{
"msg": "Message for ECDSA-NIST-521p signing",
"pubKey":"0078a6bb6732cb3134d2ca3912b2876fe005b20027037512cf972605f58ce5908471a1f9817c8d24290fcc943951f3113a7ee3716bd95f0b9c7326843a833ac6a0750021f08f88a6bd397525068300801521d2d97fea32f2c8b0c74dc8e231a4dd73252c4a7398e25ab20dba0a9df3df0c256617e004a9623676b9f3f9a3aa21f57c90ce",
"signature":"00202029ab1a3326fe7d1e9ec36d7fab048e833c6c3cad37e1d5294695d28e9fd5583c23edaeecb596782a4c85bac27780623c1a9216202f3828991cbeebbeb049d9008270ea623d8d26c5ab89b621bac12c7fa8e9193e4057e16617f80cfc4279537f45169fb949deb3f9936400a130f6859aaa9c929e47c66610e59cc71a9f7ea79e81"
}
使用 ECDSA/P-521 验证消息签名
编写程序,验证上一练习创建的 ECDSA 数字签名。输入是一个 JSON 文档,其中包含消息、公钥(未压缩的十六进制字符串)和签名。使用 P-521 椭圆曲线(secp521r1)。输出只打印一个单词:"valid" 或 "invalid"。
输入示例(正确签名的消息):
{
"msg": "Message for ECDSA-NIST-521p signing",
"pubKey":"0078a6bb6732cb3134d2ca3912b2876fe005b20027037512cf972605f58ce5908471a1f9817c8d24290fcc943951f3113a7ee3716bd95f0b9c7326843a833ac6a0750021f08f88a6bd397525068300801521d2d97fea32f2c8b0c74dc8e231a4dd73252c4a7398e25ab20dba0a9df3df0c256617e004a9623676b9f3f9a3aa21f57c90ce",
"signature":"00202029ab1a3326fe7d1e9ec36d7fab048e833c6c3cad37e1d5294695d28e9fd5583c23edaeecb596782a4c85bac27780623c1a9216202f3828991cbeebbeb049d9008270ea623d8d26c5ab89b621bac12c7fa8e9193e4057e16617f80cfc4279537f45169fb949deb3f9936400a130f6859aaa9c929e47c66610e59cc71a9f7ea79e81"
}
输出示例:
valid
输入示例(遭篡改的消息):
{
"msg": "Tampered message",
"pubKey":"0078a6bb6732cb3134d2ca3912b2876fe005b20027037512cf972605f58ce5908471a1f9817c8d24290fcc943951f3113a7ee3716bd95f0b9c7326843a833ac6a0750021f08f88a6bd397525068300801521d2d97fea32f2c8b0c74dc8e231a4dd73252c4a7398e25ab20dba0a9df3df0c256617e004a9623676b9f3f9a3aa21f57c90ce",
"signature":"00202029ab1a3326fe7d1e9ec36d7fab048e833c6c3cad37e1d5294695d28e9fd5583c23edaeecb596782a4c85bac27780623c1a9216202f3828991cbeebbeb049d9008270ea623d8d26c5ab89b621bac12c7fa8e9193e4057e16617f80cfc4279537f45169fb949deb3f9936400a130f6859aaa9c929e47c66610e59cc71a9f7ea79e81"
}
输出示例:
invalid