Генерация открытого ключа из вопросов закрытого ключа

Я использую 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, и я получаю все значения, которые я должен получить. Я не кодировал способ «обтекания» значений после достижения обратной базовой точки, но, поскольку в биткойнах пространство закрытого ключа намного меньше значения по модулю, поэтому мы не должны даже достигать этой точки, когда ценности начинают повторяться. Я собираюсь плакать о том, как это расстраивает, так что любая помощь была бы замечательной.

О, есть еще одна странная вещь. Вот пример, когда я запускаю его.

Private Key:
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725

My Public Key:
458ACBDD5DE95281B9ACAB95D0F8DAC011C895EBE95E567BE9E308C12936CCAE3B81CE567B126A604A938D29ED15B5A96779AF27B5DC9ED6F2EE187E9C582BA6

Correct Public Key:
50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

Это не очевидно, но последние 19 шестнадцатеричных цифр одинаковы, а остальные отличаются? Кстати, они одинаковой длины. Может ли это быть что-то не так с библиотекой BigInteger? Это был способ, который показался мне простым, но вы бы порекомендовали мне сделать это по-другому?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector