Python中Ed25519ph签名差异问题及Arduino适配困惑
问题原因与解决方法
核心差异:Ed25519 vs Ed25519ph
Ed25519ph是预处理哈希的Ed25519签名,核心规则是:签名算法直接使用消息的SHA-512哈希值做后续流程,不再对输入数据二次哈希。而普通Ed25519签名会对传入的任何数据(包括哈希结果)强制再做一次SHA-512哈希,这就是你看到两个用例签名不同的根本原因。
Python PyCryptodome 问题解析与解决
原因
当你传入SHA512.new(message)哈希对象时,PyCryptodome的eddsa签名器会识别出这是已完成的哈希结果,自动走Ed25519ph流程;但如果你传入哈希的字节数据,签名器会把它当成普通消息,执行二次哈希,最终生成普通Ed25519签名(对应RFC8032中Ed25519 TEST SHA(abc)用例)。
解决方法
保持传入哈希对象的写法即可,或者手动确保签名器跳过二次哈希:
from Cryptodome.Hash import SHA512 from Cryptodome.PublicKey import ECC from Cryptodome.Signature import eddsa message = b"abc" private_key = ECC.generate(curve='Ed25519') # 正确生成Ed25519ph签名的方式 digest_obj = SHA512.new(message) signer = eddsa.new(private_key, "rfc8032") ed25519ph_signature = signer.sign(digest_obj)
Arduino 问题解析与解决
原因
你大概率是把消息的SHA-512哈希字节传给了普通Ed25519签名函数,函数对哈希结果再次执行SHA-512,导致生成普通Ed25519签名而非Ed25519ph。
解决方法
- 优先使用库的Ed25519ph专用接口:如果你的Arduino Ed25519库提供带
prehashed/ph后缀的签名函数(比如ed25519_sign_prehashed),直接调用该函数并传入消息的SHA-512哈希字节。 - 手动实现Ed25519ph逻辑:如果库没有专用接口,需跳过签名函数内部的哈希步骤,直接用消息的SHA-512哈希作为签名输入:
#include <SHA512.h> #include <Ed25519.h> byte message[] = "abc"; byte privateKey[32]; // 替换为你的私钥 byte ed25519phSignature[64]; byte messageHash[64]; // 1. 计算原始消息的SHA-512哈希 SHA512 sha512; sha512.update(message, strlen((char*)message)); sha512.finalize(messageHash, sizeof(messageHash)); // 2. 调用带预处理哈希参数的签名函数(示例函数名,以你使用的库为准) Ed25519.sign_prehashed(ed25519phSignature, privateKey, messageHash, sizeof(messageHash));
内容的提问来源于stack exchange,提问作者boddeke
相关产品推荐
相关产品推荐

