Signature javaecschnorr实现

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

我正试图编写一个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 = 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中。