Реальная история.
Из
https://en.wikipedia.org/wiki/Quadratic_residue а также
http://mersennewiki.org/index.php/Modular_Square_Root, если
г ^ 2 = а по модулю т, где т = 3 по модулю 4 (в
secp256k1-х р делает)
тогда
г = + -a ^ ((т + 1) / 4) тойт
Так:
у ^ 2 по модулю р = (х ^ 3 + 7) по модулю р
у того р = + - (х ^ 3 + 7) ^ ((р + 1) / 4) по модулю р
Таким образом, вычислить (х ^ 3 + 7) ^ ((р + 1) / 4) по модулю р, и если четность первого ответа вы получаете не так, то взять негатив этого ответа (так как мы работаем по модулю нечетное число, принимая негатив будет переворачивать даже / нечетный).
Просто для удовольствия, вот некоторый Python кода, который будет делать расчет в мгновении ока, запрограммированный для работы на открытом ключе (случайный) закрытого ключ 55255657523dd1c65a77d3cb53fcd050bf7fc2c11bb0bb6edabdbd41ea51f641
Защиту pow_mod (х, у, г):
"Вычислить (х ** у)% Z эффективно."
число = 1
в то время как у:
если у & 1:
число = число * х% г
Y >>= 1
х = х * х% г
возвращение номер
р = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
compressed_key = '0314fc03b8df87cd7b872996810db8458d61da8448e531569c8517b469a119d267'
y_parity = INT (compressed_key [: 2]) - 2
х = INT (compressed_key [2:], 16)
а = (pow_mod (х, 3, р) + 7)% р
у = pow_mod (а, (р + 1) // 4, р)
если у% 2 = y_parity:
у = -y% р
uncompressed_key = '04 {:} {х: х}. Формат»(х, у)
печать (uncompressed_key)