From ac92910ecfa934b89a076910b23706f2b8c26fc6 Mon Sep 17 00:00:00 2001 From: Krishna Jalan Date: Fri, 28 Aug 2020 13:45:28 +0530 Subject: [PATCH 1/4] create a fast modular exponent function this function run in log(N) time complexity and log(N) space complexity to find the modular exponent and can be used cryptographic encryption to find the modular exponent of a really large prime numer --- src/ecdsa/numbertheory.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ecdsa/numbertheory.py b/src/ecdsa/numbertheory.py index e5cc888d..db561539 100644 --- a/src/ecdsa/numbertheory.py +++ b/src/ecdsa/numbertheory.py @@ -62,8 +62,25 @@ def modular_exp(base, exponent, modulus): # pragma: no cover raise NegativeExponentError( "Negative exponents (%d) not allowed" % exponent ) - return pow(base, exponent, modulus) + return fast_modular_exponentiation(base, exponent, modulus) +def fast_modular_exponentiation(base, exponent, modulas): + + """Log(N) computation required to find the final Exponent""" + binary = bin(exponent)[-1:1:-1] + l = {} + ans = base + for i in range(len(binary)): + + l[i] = ans + ans = (ans**2)%modulas + + ans =1 + for i in range(len(binary)): + if binary[i]=='1': + ans *= l[i]%modulas + + return ans%modulas def polynomial_reduce_mod(poly, polymod, p): """Reduce poly by polymod, integer arithmetic modulo p. From f8b3f1196a9aeb45a4bbfb65d5fbd61476cbbcd3 Mon Sep 17 00:00:00 2001 From: Krishna Jalan Date: Fri, 28 Aug 2020 14:17:44 +0530 Subject: [PATCH 2/4] change range to xrange --- src/ecdsa/numbertheory.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ecdsa/numbertheory.py b/src/ecdsa/numbertheory.py index db561539..42c19b88 100644 --- a/src/ecdsa/numbertheory.py +++ b/src/ecdsa/numbertheory.py @@ -62,7 +62,10 @@ def modular_exp(base, exponent, modulus): # pragma: no cover raise NegativeExponentError( "Negative exponents (%d) not allowed" % exponent ) - return fast_modular_exponentiation(base, exponent, modulus) + if (type(exponent)==int): + return fast_modular_exponentiation(base, exponent, modulus) + else: + return pow(base, exponent, modulus) def fast_modular_exponentiation(base, exponent, modulas): @@ -70,13 +73,13 @@ def fast_modular_exponentiation(base, exponent, modulas): binary = bin(exponent)[-1:1:-1] l = {} ans = base - for i in range(len(binary)): + for i in xrange(len(binary)): l[i] = ans ans = (ans**2)%modulas ans =1 - for i in range(len(binary)): + for i in xrange(len(binary)): if binary[i]=='1': ans *= l[i]%modulas From 214e45885b96bf69561ca1c8be6cbd2318065f77 Mon Sep 17 00:00:00 2001 From: Krishna Jalan Date: Fri, 28 Aug 2020 15:02:21 +0530 Subject: [PATCH 3/4] remove extra for loop removed an extra for loop and merge its content in first loop so must increase performance --- src/ecdsa/numbertheory.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/ecdsa/numbertheory.py b/src/ecdsa/numbertheory.py index 42c19b88..13d13616 100644 --- a/src/ecdsa/numbertheory.py +++ b/src/ecdsa/numbertheory.py @@ -68,21 +68,15 @@ def modular_exp(base, exponent, modulus): # pragma: no cover return pow(base, exponent, modulus) def fast_modular_exponentiation(base, exponent, modulas): - + """Log(N) computation required to find the final Exponent""" binary = bin(exponent)[-1:1:-1] l = {} - ans = base - for i in xrange(len(binary)): - - l[i] = ans - ans = (ans**2)%modulas - - ans =1 for i in xrange(len(binary)): + l[i] = base + base = (base**2)%modulas if binary[i]=='1': - ans *= l[i]%modulas - + ans *= l[i]%modulas return ans%modulas def polynomial_reduce_mod(poly, polymod, p): From 9226ce39ed66ef666217bf20d81820c6a8dd1762 Mon Sep 17 00:00:00 2001 From: Krishna Jalan Date: Mon, 31 Aug 2020 15:00:51 +0530 Subject: [PATCH 4/4] fast modular exponent --- src/ecdsa/numbertheory.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ecdsa/numbertheory.py b/src/ecdsa/numbertheory.py index 13d13616..7b3ef892 100644 --- a/src/ecdsa/numbertheory.py +++ b/src/ecdsa/numbertheory.py @@ -72,12 +72,13 @@ def fast_modular_exponentiation(base, exponent, modulas): """Log(N) computation required to find the final Exponent""" binary = bin(exponent)[-1:1:-1] l = {} - for i in xrange(len(binary)): + ans = 1 + for i in range(len(binary)): l[i] = base base = (base**2)%modulas if binary[i]=='1': - ans *= l[i]%modulas - return ans%modulas + ans *= l[i]%modulas + return ans%modulas def polynomial_reduce_mod(poly, polymod, p): """Reduce poly by polymod, integer arithmetic modulo p.