练习: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

results matching ""

    No results matching ""