我正在tor网络上构建一个加密消息应用程序,目前我正在努力使用tor生成的ed25519私钥来签名和验证任何消息。
以下代码使用32字节的密钥,但在跳过hs_ed25519_secret_key的32个标头字节后,在以下情况下无法验证签名:
1-secret:剩余64字节的左半部分,public:右半部分
2-secret:其余64字节的左半部分,public:移除标头后hs_ed25519_public_key的最后32个字节
3-secret:所有64个字节,public:hs _ed25519k_public_key的最后32字节
我发现了一个python库,它似乎可以做到这一点PyNaCl,但我对py不太熟悉。
是不是我做错了什么,或者bouncycastle不支持扩展的64字节私钥
import org.bouncycastle.crypto.Signer;
import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
import org.bouncycastle.crypto.signers.Ed25519Signer;
import java.nio.charset.StandardCharsets;
public class ED25519 {
public static void main(String[] args) throws Exception {
byte[] message = "a msg to be signed".getBytes(StandardCharsets.UTF_8);
Signer signer = new Ed25519Signer();
signer.init(true, new Ed25519PrivateKeyParameters(KeysUtil.myPrivKey, 0));
signer.update(message, 0, message.length);
Signer verifier = new Ed25519Signer();
verifier.init(false, new Ed25519PublicKeyParameters(KeysUtil.myPubKey, 0));
verifier.update(message, 0, message.length);
boolean validSig = verifier.verifySignature(signer.generateSignature());
}
}
BouncyCastle使用RFC 8032定义的私钥,它基本上是一个32字节的种子。该种子被输入到SHA512,它产生64个字节,包括一个"内部"32字节秘密("s"(和一个附加的32字节伪随机值("h"(。看起来Tor将后64个字节(SHA512的输出(视为密钥,因此这是不兼容的。
当然,提供一种使用这些键的方法相对简单(至少在低级实用程序中是这样(,但它还不存在。