You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

解决方法

  1. 优先使用库的Ed25519ph专用接口:如果你的Arduino Ed25519库提供带prehashed/ph后缀的签名函数(比如ed25519_sign_prehashed),直接调用该函数并传入消息的SHA-512哈希字节。
  2. 手动实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:22:41