首页 > 解决方案 > Java EC-Schnorr 实现

问题描述

我正在尝试编写 EC-Schnorr 实现,如以下 BIP 中所述:https ://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki

我有以下代码用于使用 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,似乎没有被正确计算,我不知道为什么。

任何帮助,将不胜感激。

标签: signature

解决方案


推荐阅读