练习:EdDSA 签名与验证
在本练习中,我们将按照 RFC 8032 的技术规范,使用 EdDSA 数字签名算法和 edwards25519 曲线对消息进行签名和验证。大多数编程语言都提供 Ed25519 数字签名算法库。
Ed25519 私钥编码为 64 个十六进制数字(32 字节),相应的 Ed25519 公钥也编码为 64 个十六进制数字(32 字节)。EdDSA-Ed25519 签名 {R, s} 由 32 + 32 字节组成(64 字节,128 个十六进制数字)。
EdDSA-Ed25519:消息签名
编写程序,使用给定私钥对指定文本消息进行签名。输入由 2 行文本组成。第一行保存待签名的输入消息,第二行以十六进制字符串形式保存私钥。以 JSON 文档形式打印输出,其中包含输入消息、签名者的公钥(未压缩的十六进制字符串)和 Ed25519 数字签名(十六进制字符串)。
输入示例:
Message for Ed25519 signing
de6d730f36a8607b8bfdaa79b3b1127291f1d50552c2fe05c5254a9719105c4a
输出示例:
{
"msg": "Message for Ed25519 signing",
"pubKey":"7721a5832cb70cce1a960cf236d50a0e862555ccad400b5fee0bcf777f7ab476",
"signature":"6c4adbba332b5db520c0ec95433ea136f70fe2d50e8955a7049d216626a3491c0e5cbfefb8d779687cc9811311ccaf7cd07a0e96a570fb3a4b680a4ead60c602"
}
EdDSA-Ed25519:验证签名
编写程序,验证上一练习创建的 Ed25519 数字签名。输入是一个 JSON 文档,其中包含消息、公钥(未压缩的十六进制字符串)和签名。输出只打印一个单词:"valid" 或 "invalid"。
输入示例(正确签名的消息):
{
"msg": "Message for Ed25519 signing",
"pubKey":"7721a5832cb70cce1a960cf236d50a0e862555ccad400b5fee0bcf777f7ab476",
"signature":"6c4adbba332b5db520c0ec95433ea136f70fe2d50e8955a7049d216626a3491c0e5cbfefb8d779687cc9811311ccaf7cd07a0e96a570fb3a4b680a4ead60c602"
}
输出示例:
valid
输入示例(遭篡改的消息):
{
"msg": "Tampered msg",
"pubKey":"7721a5832cb70cce1a960cf236d50a0e862555ccad400b5fee0bcf777f7ab476",
"signature":"6c4adbba332b5db520c0ec95433ea136f70fe2d50e8955a7049d216626a3491c0e5cbfefb8d779687cc9811311ccaf7cd07a0e96a570fb3a4b680a4ead60c602"
}
输出示例:
invalid