Signature javaecschnorr实现
我正试图编写一个EC Schnorr实现,如以下BIP所述: 我有以下使用Java和BouncyCastle生成签名的代码:Signature javaecschnorr实现,signature,Signature,我正试图编写一个EC Schnorr实现,如以下BIP所述: 我有以下使用Java和BouncyCastle生成签名的代码: public SchnorrSig sign(byte[] hash) { MessageDigest md = new SHA256.Digest(); /* Hash private key & message hash, convert to int mod order */ BigInteger k = by
public SchnorrSig sign(byte[] hash) {
MessageDigest md = new SHA256.Digest();
/* Hash private key & message hash, convert to int mod order */
BigInteger k = bytesToBigInteger(md.digest(merge(privkey, hash))).mod(order);
/* Use k value as deterministic nonce for R point */
ECPoint R = G.multiply(k).normalize();
/* Checks if R is a quadratic residue (?) */
while (jacobi(R.getAffineYCoord().toBigInteger()) != 1) {
k = (order.subtract(k));
R = G.multiply(k).normalize();
}
md = new SHA256.Digest();
/* Hashes x-coord of R + public key point x coord + message hash, converts to int mod order */
BigInteger e = bytesToBigInteger(md.digest(merge(bigIntegerToBytes(R.getAffineXCoord().toBigInteger()), Hex.decode("03"), pubkey, hash))).mod(order);
/* Returns R point + (k e*priv) mod order */
return new SchnorrSig(R, k.add(e.multiply(bytesToBigInteger(privkey))).mod(order));
}
但是,它与提案中提供的任何测试向量都不匹配。据我所知,公钥和R点的计算是正确的,但e值(随后成为s)似乎没有正确计算,我也不知道为什么
任何帮助都将不胜感激。相信你的话,
R
是可以的(尽管的基本原理检查R是否是二次剩余
的东西让我无法理解),你的e
代码似乎没有模仿e=sha256(R[0]。to_字节(32,byteorder=“big”)+字节(point_mul(point,seckey))+msg)参考代码的
。1) 您似乎要散列一个散列,而原始文件似乎要散列一条消息。2) 我看不出您的代码从何处获得X坐标的32字节大小,除非它被烧成bigIntegerToBytes
。3) Hex.decode(“03”),只有当pubkey
是32字节上的X坐标并且匹配的Y是奇数时,pubkey
才起作用。@fgrieu根据我在GitHub链接的描述中理解,“消息”始终是32字节数组,因此,我假设这是实际消息的散列。也许你可以要求提案的作者也为计算的所有中间阶段提供测试向量?@squemishossifrage我刚刚提出了一个请求,希望他们能用这些来更新它values@fgrieu你是对的-压缩点是问题所在。现在我已经修好了,一切似乎都按预期进行。另外,我很抱歉将问题发布在这里而不是SO中。