Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

error in elliptic curve scalar multiplication code

The following code i have written for scalar multiplication over elliptic curve for prime field 37 but it gives me error for some of the scalar. the method is LSB first.enter code here
import time import sys from sage.all import *

elliptic curve domain parameters, prime192v1

domain parameters

p=37 A=7 B=25 G=1 n=21

print"\n p=",p print"\n A=",A print"\n B=",B F=GF(p)

E = EllipticCurve( F, [A,B] ); print "\n Elliptic curve equation=", E

def point_add(P, Q):

x1 = P[0]
y1 = P[1]
x2 = Q[0]
y2 = Q[1]


# check P == O
if P == [0, 0]:
    return Q

# check Q == O
if Q == [0, 0]:
    return P

# check Q == -P
if x1 == x2 and y1 + y2 == 0:
    return [0, 0]

# check P == Q
if P == Q:
    return point_double(P)
slope = F((y2 - y1)/(x2 - x1))
x3 = F(slope**2 - x1 - x2)
y3 = F(slope * (x1 - x3) - y1)

return[x3 , y3]

def point_double(P):

#if P == [0, 0]:
    #return [0, 0]

x1 = P[0]
y1 = P[1]

slope = F((3 * x1**2 + A)/(2 * y1))
x3 = F(slope**2 - 2 * x1)
y3 = F(slope * (x1 - x3) - y1)
return [x3, y3]

def scalar_mult(K,P): print('hi') b_k =ZZ(K).bits();print(b_k); #K.digits(2); l = len(b_k);l sum1 = 0*P;sum1 print(b_k[0]) if b_k[0] == 1: sum1 = P;sum1 else: sum1 = 0 Q = P;print(Q) for i in range(1,l): Q = point_double(Q);print(Q) if b_k[i] == 1: print (b_k[i]) #sum = point_add(sum,Q) sum1 = point_add(sum1,Q) print(sum1)#Q = point_double(Q);

    return sum1

P = E(20,32);P#.random_point();P f1=P.order();f1 K =randint(1,f1);K answer1=K*P;answer1 start1 = time.time() answer = scalar_mult(K,P);answer end1 = time.time() print "\n Time Required to compute scalar multiplication: %s" % ( end1 - start1 ) answer2=E(answer);answer2

error in elliptic curve scalar multiplication code

The following code i have written for scalar multiplication over elliptic curve for prime field 37 but it gives me error for some of the scalar. the method is LSB first.

enter code here 
import time import sys from sage.all import *

* # elliptic curve domain parameters, prime192v1

prime192v1 # domain parameters

p=37 A=7 B=25 G=1 n=21

print"\n p=",p print"\n A=",A print"\n B=",B F=GF(p)

parameters p = 37 A = 7 B = 25 G = 1 n = 21 print "\n p =", p print "\n A =", A print "\n B =", B F = GF(p) E = EllipticCurve( F, [A,B] ); EllipticCurve(F, [A,B]) print "\n Elliptic curve equation=", E

equation:", E def point_add(P, Q):

Q):

    x1 = P[0]
 y1 = P[1]
 x2 = Q[0]
 y2 = Q[1]

  # check P == O
 if P == [0, 0]:
     return Q

 # check Q == O
 if Q == [0, 0]:
     return P

 # check Q == -P
 if x1 == x2 and y1 + y2 == 0:
     return [0, 0]

 # check P == Q
 if P == Q:
     return point_double(P)
 slope = F((y2 - y1)/(x2 - x1))
 x3 = F(slope**2 - x1 - x2)
 y3 = F(slope * (x1 - x3) - y1)

return[x3 ,     return[x3, y3]

def point_double(P):

#if point_double(P):

    # if P == [0, 0]:
    #return #     return [0, 0]

 x1 = P[0]
 y1 = P[1]

 slope = F((3 * x1**2 + A)/(2 * y1))
 x3 = F(slope**2 - 2 * x1)
 y3 = F(slope * (x1 - x3) - y1)
 return [x3, y3]

def scalar_mult(K,P): print('hi') b_k =ZZ(K).bits();print(b_k); #K.digits(2); = ZZ(K).bits(); print(b_k) # ; K.digits(2) l = len(b_k);l len(b_k); l sum1 = 0*P;sum1 0*P; sum1 print(b_k[0]) if b_k[0] == 1: sum1 = P;sum1 P; sum1 else: sum1 = 0 Q = P;print(Q) P; print(Q) for i in range(1,l): range(1, l): Q = point_double(Q);print(Q) point_double(Q); print(Q) if b_k[i] == 1: print (b_k[i]) #sum = point_add(sum,Q) (b_k[i]) # sum = point_add(sum, Q) sum1 = point_add(sum1,Q) print(sum1)#Q = point_double(Q);

point_add(sum1, Q)
            print(sum1)
            # Q = point_double(Q)
    return sum1

P = E(20,32);P#.random_point();P f1=P.order();f1 E(20,32); P #; P.random_point(); P f1 = P.order(); f1 K =randint(1,f1);K answer1=K*P;answer1 = randint(1,f1); K answer1 = K*P; answer1 start1 = time.time() answer = scalar_mult(K,P);answer scalar_mult(K,P); answer end1 = time.time() print "\n Time Required to compute scalar multiplication: %s" % ( end1 - start1 ) answer2=E(answer);answer2

(end1 - start1) answer2 = E(answer); answer2