java:使用BouncyCastle验证Ed25519签名未按预期工作

java:使用BouncyCastle验证Ed25519签名未按预期工作,java,bouncycastle,ed25519,Java,Bouncycastle,Ed25519,不幸的是,我还没有找到谷歌的答案,所以我想我还是问问吧 我正在尝试编写一个服务库,用于向客户端发送消息、时间戳和签名,其中签名应该是sign(privkey,timestamp+message),而消息是原始JSON。我的验证尝试如下所示: public boolean validate(String pubkey, String signature, String timestamp, String message) throws Exception { final var provi

不幸的是,我还没有找到谷歌的答案,所以我想我还是问问吧

我正在尝试编写一个服务库,用于向客户端发送消息、时间戳和签名,其中签名应该是
sign(privkey,timestamp+message)
,而消息是原始JSON。我的验证尝试如下所示:

public boolean validate(String pubkey, String signature, String timestamp, String message) throws Exception {
    final var provider = new BouncyCastleProvider();
    Security.addProvider(provider);
    final var byteKey = Hex.decodeHex(pubkey);
    final var pki = new SubjectPublicKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), byteKey);
    final var pkSpec = new X509EncodedKeySpec(pki.getEncoded());
    final var kf = KeyFactory.getInstance("ed25519", provider);
    final var publicKey = kf.generatePublic(pkSpec);
    final var signedData = Signature.getInstance("ed25519", provider);
    signedData.initVerify(publicKey);
    signedData.update(timestamp.getBytes());
    signedData.update(message.getBytes());
    return signedData.verify(Hex.decodeHex(signature));
}

我已经尝试了我的验证方法,例如,来自的示例代码,它运行良好;特别是只有在“真实”数据的情况下,它才会失败。我很困惑为什么会发生这种情况,如果有任何建议,我将不胜感激。

事实证明,我使用的服务只是向我发送了格式错误的数据;我的代码实际上是正确的,但该服务大部分时间只是向我发送无效数据。

结果表明,我使用的服务只是向我发送格式错误的数据;我的代码实际上是正确的,但大多数时候服务只是向我发送无效数据。

如果代码在原则上有效,那么签名的工作方式可能与您想象的不同。您能否发布用于签名的代码和示例数据:私钥、公钥、时间戳、消息和签名?如果代码在原则上有效,那么签名的工作方式可能与您想象的不同。您可以发布用于签名的代码和示例数据:私钥、公钥、时间戳、消息和签名吗?