从私钥问题生成公钥

时间:2016-11-03 00:41:04

标签: c++ biginteger bitcoin public-key elliptic-curve

我正在使用BigIntegerLibrary,这是应用secp256k1。

这是我生成公钥的功能。

std::string genPublicKey(BigInteger privateKey){
    std::vector<bool> sequence = reducePointOps(privateKey);

    BigInteger s;
    BigInteger x3 = basePoint_X;
    BigInteger y3 = basePoint_Y;
    BigInteger rx, ry;
    BigInteger three(3);
    BigInteger two(2);

    for(std::vector<bool>::reverse_iterator it = sequence.rbegin(); it != sequence.rend(); ++it){
        //meaning point doubling
        if(*it == true){
            s = (((three * ((x3 * x3)%primeModulo))+a) * inverse(two*y3)) % primeModule;

            rx = (((s*s)%primeModulo)-(two * x3))% primeModulo;

            ry = (s * (x3 - rx) - y3)%primeModulo;
            //cout<<"Doubling: s="<<s<<", x="<<rx<<", y="<<ry<<endl;
        }
        //meaning point addition
        else{
            //(x2,y2) -> base point         (x1,y1)->(x3, y3) aka previously calculated point
            s = ((basePoint_Y - y3) * inverse(basePoint_X - x3))%primeModulo;


            rx = (((s*s) % primeModulo) - x3 - basePoint_X) % primeModulo;

            ry = ((s * (x3 - rx)) - y3)%primeModulo;
            //cout<<"Addition: s="<<s<<", x="<<rx<<", y="<<ry<<endl;        
        }
        //cout<<endl;

        x3=rx;
        y3=ry;

    }
    std::string x3_str = bigIntegerToString(x3);
    std::string y3_str = bigIntegerToString(y3);
    return (x3_str + y3_str);
}

这是我的反函数,但是我从某个地方拿走了这个,所以我几乎是正面的,这是正确的。另外,我测试了它并且正在工作。

BigInteger inverse(BigInteger a){
    BigInteger s;
    BigInteger t;
    eea(primeModulo, a, &s, &t);
    if(t<0)
        return (t%primeModulo);
    else
        return t;
}

BigInteger eea(BigInteger a, BigInteger b, BigInteger *s, BigInteger *t){
    if(a==0){
        *s=0;
        *t=1;
        return b;
    }

    BigInteger s1;
    BigInteger t1;
    BigInteger gcd = eea(b%a, a, &s1, &t1);
    *s = t1 - (b/a) * s1;
    *t = s1;

    return gcd;
}

除此之外,只有我的功能是减少指向倍增和加法的操作量。我已经手工制作了很多例子,所以我知道这个函数的数据是正确的。

奇怪的是,我已经在我的密码学课程中尝试了这个例子,其值m = 17 x = 5 y = 1 a = 2并且我得到了我应该得到的所有值。我没有为这些值编写代码的方式来包装&#39;一旦达到基点的倒数,但由于使用比特币,私钥空间远小于模数值,因此当值开始重复时,我们甚至不应该达到该点。我即将哭泣,这是多么令人沮丧,所以任何帮助都会很精彩。

哦还有另外一件奇怪的事情。这是我运行时的一个例子。

Private Key:
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725

My Public Key: 
458ACBDD5DE95281B9ACAB95D0F8DAC011C895EBE95E567BE9E308C12936CCAE3B81CE567B126A604A938D29ED15B5A96779AF27B5DC9ED6F2EE187E9C582BA6

Correct Public Key:
50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

它不明显,但最后19个十六进制数字是相同的,但其余的是不同的?顺便说一句,它们的长度相同。这可能是BigInteger库出了问题吗?这对我来说似乎很简单,但你会建议我以不同的方式做到这一点吗?

0 个答案:

没有答案