حالا فرض میکنیم که شما موفق شدین ان رو با پی جمع ببندین و تقسیم بر ۲ کنید، چه نتیجه ای میتونید بگیرید با این کار؟ اگر فکر میکنی که با ان و پی کوچکتر راحتتر میتونی کار کنی من میتونم اسکریپت در اختیارتون بذارم تا ان و پی رو به دلخواه انتخاب کنید، ولی نکته ای که باید در نظر داشته باشی، اینه که درسته که پابلیک کی فقط نماینده ی پرایوت کی هست اما دلیلی وجود نداره که شما فکر کنید رابطه ای بین این دو وجود داره بخصوص بین ان و پی، شما فقط زمانی با پی سر و کار دارید که تنها پابلیک کی در اختیارتونه ، اما وقتی با اسکالار کار کنید متوجه میشید که اصلا پی هیچ تاثیری در محاسبات شما نداره یا به عبارتی دیگر ، پی وجود خارجی نداره در معادلات مربوط به محاسبه پرایوت کی.
حالا فرض میکنیم که شما موفق شدین ان رو با پی جمع ببندین و تقسیم بر ۲ کنید، چه نتیجه ای میتونید بگیرید با این کار؟ اگر فکر میکنی که با ان و پی کوچکتر راحتتر میتونی کار کنی من میتونم اسکریپت در اختیارتون بذارم تا ان و پی رو به دلخواه انتخاب کنید، ولی نکته ای که باید در نظر داشته باشی، اینه که درسته که پابلیک کی فقط نماینده ی پرایوت کی هست اما دلیلی وجود نداره که شما فکر کنید رابطه ای بین این دو وجود داره بخصوص بین ان و پی، شما فقط زمانی با پی سر و کار دارید که تنها پابلیک کی در اختیارتونه ، اما وقتی با اسکالار کار کنید متوجه میشید که اصلا پی هیچ تاثیری در محاسبات شما نداره یا به عبارتی دیگر ، پی وجود خارجی نداره در معادلات مربوط به محاسبه پرایوت کی.
injoori fekr nakon , kheyli ha hastan k curvo shekondan faghat publish namishe. man chizayi k migam ba example hastan theory nistan . faghat yekam komak mikham . age soali dashti begoo ba example bet begam.
code payino to python 2 run kon bebin .ablein groups 6 set of pk ,3x ,2y
pvk_hex = 40360748372915677739060455046407153445907911874643188801639465548522 # input privatekey
# 6 Pubkeys are
# Pubkey = [x,y] [x*beta%p, y] [x*beta2%p, y] [x,p-y] [x*beta%p, p-y] [x*beta2%p, p-y]
# 6 Privatekeys are
# pvk, pvk*lmda%N, pvk*lmda2%N, N-pvk, N-pvk*lmda%N, N-pvk*lmda2%N
# Field parameters
Pcurve = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
N = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
# Constants Based on Cube root of 1
beta = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee
beta2 = 0x851695d49a83f8ef919bb86153cbcb16630fb68aed0a766a3ec693d68e6afa40 # beta*beta
lmda = 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72
lmda2 = 0xac9c52b33fa3cf1f5ad9e3fd77ed9ba4a880b9fc8ec739c2e0cfc810b51283ce # lmda*lmda
Acurve = 0
Bcurve = 7 # These two define the elliptic curve. y^2 = x^3 + Acurve * x + Bcurve
Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240 # generator point x
Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424 # generator point y
GPoint = (Gx, Gy)
def OnCurve(x, y):
A = (y * y) % Pcurve
B = (x * x * x + Acurve * x + Bcurve) % Pcurve
return A == B
def legendre_symbol(a, p):
ls = pow(a, (p - 1) // 2, p)
return -1 if ls == p - 1 else ls
def modsqrt(a, p):
if legendre_symbol(a, p) != 1:
return 0
elif a == 0:
return 0
elif p == 2:
return p
elif p % 4 == 3:
return pow(a, (p + 1) // 4, p)
s = p - 1
e = 0
while s % 2 == 0:
s //= 2
e += 1
n = 2
while legendre_symbol(n, p) != -1:
n += 1
x = pow(a, (s + 1) // 2, p)
b = pow(a, s, p)
g = pow(n, s, p)
r = e
while True:
t = b
m = 0
for m in range(r):
if t == 1:
break
t = pow(t, 2, p)
if m == 0:
return x
gs = pow(g, 2 ** (r - m - 1), p)
g = (gs * gs) % p
x = (x * gs) % p
b = (b * g) % p
r = m
def modinv(a, n):
lm, hm = 1, 0
low, high = a % n, n
while low > 1:
ratio = high // low
nm, new = hm - lm * ratio, high - low * ratio
lm, low, hm, high = nm, new, lm, low
return lm % n
def ECadd(a, b):
LamAdd = ((b[1] - a[1]) * modinv(b[0] - a[0], Pcurve)) % Pcurve
x = (LamAdd * LamAdd - a[0] - b[0]) % Pcurve
y = (LamAdd * (a[0] - x) - a[1]) % Pcurve
return (x, y)
def ECdouble(a):
Lam = ((3 * a[0] * a[0] + Acurve) * modinv(2 * a[1], Pcurve)) % Pcurve
x = (Lam * Lam - 2 * a[0]) % Pcurve
y = (Lam * (a[0] - x) - a[1]) % Pcurve
return (x, y)
def one_to_6privatekey(pvk_hex):
pvk = int(pvk_hex)
print('PVK1 :', pvk)
print('PVK2 :', (pvk * lmda % N))
print('PVK3 :', (pvk * lmda2 % N))
print('PVK4 :', (N - pvk))
print('PVK5 :', (N - pvk * lmda % N))
print('PVK6 :', (N - pvk * lmda2 % N))
print('Pubkey1 :', EccMultiply(GPoint, pvk))
print('Pubkey2 :', EccMultiply(GPoint, pvk * lmda % N))
print('Pubkey3 :', EccMultiply(GPoint, pvk * lmda2 % N))
print('Pubkey4 :', EccMultiply(GPoint, N - pvk))
print('Pubkey5 :', EccMultiply(GPoint, N - pvk * lmda % N))
print('Pubkey6 :', EccMultiply(GPoint, N - pvk * lmda2 % N))
print()
print()
print('pvk++ :', (N - pvk) + (N - pvk * lmda % N) + (N - pvk * lmda2 % N))
print('pvk-- :', (N - pvk) - (N - pvk * lmda % N) - (N - pvk * lmda2 % N))
print('pvk--/2 :', ((N - pvk) - (N - pvk * lmda % N) - (N - pvk * lmda2 % N)) / 2)
def EccMultiply(GenPoint, ScalarHex):
if ScalarHex == 0 or ScalarHex >= N:
raise Exception("Invalid Scalar/Private Key")
ScalarBin = bin(ScalarHex)[2:]
Q = GenPoint
for i in range(1, len(ScalarBin)):
Q = ECdouble(Q)
if ScalarBin
== "1":
Q = ECadd(Q, GenPoint)
return Q
# Call the function
one_to_6privatekey(pvk_hex)