summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Mead <barrymead@cox.net>2010-02-21 14:56:41 -0700
committerBarry Mead <barrymead@cox.net>2010-02-21 14:56:41 -0700
commit60fb06ddbac89c83ad3cb6b9a2c3c42d19b7a709 (patch)
tree5cf9c2f69b97a62f0283f44bf4122e70b8792cd1
parentc915b229531e2dac19101504806994ace12846e3 (diff)
downloadrsa-60fb06ddbac89c83ad3cb6b9a2c3c42d19b7a709.tar.gz
Added bit_size function remove log clutter
-rw-r--r--rsa/__init__.py21
-rw-r--r--rsa/fastrsa.py27
2 files changed, 29 insertions, 19 deletions
diff --git a/rsa/__init__.py b/rsa/__init__.py
index d7fddd5..00c6c8f 100644
--- a/rsa/__init__.py
+++ b/rsa/__init__.py
@@ -13,6 +13,11 @@ import random
import sys
import types
+def bit_size(number):
+ """Returns the number of bits required to hold a specific long number"""
+
+ return int(math.ceil(math.log(number,2)))
+
def gcd(p, q):
"""Returns the greatest common divisor of p and q
>>> gcd(48, 180)
@@ -167,7 +172,7 @@ def fast_exponentiation(a, e, n):
"""
#Single loop version is faster and uses less memory
#MSB is always 1 so skip testing it and start with result = a
- msbe = int(math.ceil(math.log(e,2))) - 2 #Find MSB-1 of exponent
+ msbe = bit_size(e) - 2 #Find MSB-1 of exponent
test = long(1 << msbe) #Isolate each expoent bit with test value
a %= n #Throw away any overflow modulo n
result = a #Start with result = a (skip MSB test)
@@ -198,7 +203,7 @@ def randint(minvalue, maxvalue):
range = maxvalue - minvalue
# Which is this number of bytes
- rangebytes = int(math.ceil(math.log(range, 2) / 8.))
+ rangebytes = int(bit_size(range) / 8.)
# Convert to bits, but make sure it's always at least min_nbits*2
rangebits = max(rangebytes * 8, min_nbits * 2)
@@ -402,8 +407,8 @@ def encrypt_int(message, ekey, n):
raise OverflowError("The message is too long")
#Note: Bit exponents start at zero (bit counts start at 1) this is correct
- safebit = int(math.floor(math.log(n,2))) - 1 #compute safe bit (MSB - 1)
- message += (1 << safebit) #add safebit to ensure folding
+ safebit = bit_size(n) - 2 #compute safe bit (MSB - 1)
+ message += (1 << safebit) #add safebit to ensure folding
return fast_exponentiation(message, ekey, n)
@@ -413,8 +418,8 @@ def decrypt_int(cyphertext, dkey, n):
message = fast_exponentiation(cyphertext, dkey, n)
- safebit = int(math.floor(math.log(n,2))) - 1 #compute safe bit (MSB - 1)
- message -= (1 << safebit) #remove safebit before decode
+ safebit = bit_size(n) - 2 #compute safe bit (MSB - 1)
+ message -= (1 << safebit) #remove safebit before decode
return message
@@ -459,8 +464,8 @@ def chopstring(message, key, n, funcref):
msglen = len(message)
mbits = msglen * 8
- # floor of log deducts 1 bit of n and the - 1, deducts the second bit.
- nbits = int(math.floor(math.log(n, 2))) - 1 # leave room for safebit
+ #Bit counts start at 1, bit numbers start at zero (so deduct 2)
+ nbits = bit_size(n) - 2 # leave room for safebit
nbytes = nbits / 8
blocks = msglen / nbytes
diff --git a/rsa/fastrsa.py b/rsa/fastrsa.py
index f1bd87a..1437da7 100644
--- a/rsa/fastrsa.py
+++ b/rsa/fastrsa.py
@@ -13,6 +13,11 @@ import random
import sys
import types
+def bit_size(number):
+ """Returns the number of bits required to hold a specific long number"""
+
+ return int(math.ceil(math.log(number,2)))
+
def gcd(p, q):
"""Returns the greatest common divisor of p and q
>>> gcd(48, 180)
@@ -167,7 +172,7 @@ def fast_exponentiation(a, e, n):
"""
#Single loop version is faster and uses less memory
#MSB is always 1 so skip testing it and start with result = a
- msbe = int(math.ceil(math.log(e,2))) - 2 #Find MSB-1 of exponent
+ msbe = bit_size(e) - 2 #Find MSB-1 of exponent
test = long(1 << msbe) #Isolate each exponent bit with test value
a %= n #Throw away any overflow modulo n
result = a #Start with result = a (skip MSB test)
@@ -198,7 +203,7 @@ def randint(minvalue, maxvalue):
range = maxvalue - minvalue
# Which is this number of bytes
- rangebytes = int(math.ceil(math.log(range, 2) / 8.))
+ rangebytes = ((bit_size(range) + 7) / 8)
# Convert to bits, but make sure it's always at least min_nbits*2
rangebits = max(rangebytes * 8, min_nbits * 2)
@@ -408,8 +413,8 @@ def encrypt_int(message, key):
raise OverflowError("The message is too long")
#Note: Bit exponents start at zero (bit counts start at 1) this is correct
- safebit = int(math.floor(math.log(key['n'],2))) - 1 #safe bit is (MSB - 1)
- message += (1 << safebit) #add safebit to ensure folding
+ safebit = bit_size(n) - 2 #safe bit is (MSB - 1)
+ message += (1 << safebit) #add safebit to ensure folding
return fast_exponentiation(message, key['e'], key['n'])
@@ -425,8 +430,8 @@ def verify_int(cyphertext, key):
message = fast_exponentiation(cyphertext, key['e'], key['n'])
#Note: Bit exponents start at zero (bit counts start at 1) this is correct
- safebit = int(math.floor(math.log(key['n'],2))) - 1 #safe bit is (MSB - 1)
- message -= (1 << safebit) #remove safe bit before decode
+ safebit = bit_size(n) - 2 #safe bit is (MSB - 1)
+ message -= (1 << safebit) #remove safe bit before decode
return message
@@ -444,8 +449,8 @@ def decrypt_int(cyphertext, key):
h = (key['qi'] * dif) % p
message = m2 + (h * q)
- safebit = int(math.floor(math.log(n,2))) - 1 #safe bit is (MSB - 1)
- message -= (1 << safebit) #remove safebit before decode
+ safebit = bit_size(n) - 2 #safe bit is (MSB - 1)
+ message -= (1 << safebit) #remove safebit before decode
return message
@@ -459,14 +464,14 @@ def sign_int(message, key):
if not type(message) is types.LongType:
raise TypeError("You must pass a long or int")
- p = key['p'] #Reduce dictionary lookups
+ p = key['p'] #Reduce dictionary lookups
q = key['q']
n = p * q
if message < 0 or message > n:
raise OverflowError("The message is too long")
- safebit = int(math.floor(math.log(n,2))) - 1 #safe bit is (MSB - 1)
+ safebit = bit_size(n) - 2 #safe bit is (MSB - 1)
message += (1 << safebit) #add safebit before encrypt
#Encrypt in 2 parts, using faster Chinese Remainder Theorem method
@@ -526,7 +531,7 @@ def chopstring(message, key, funcref):
msglen = len(message)
mbits = msglen * 8
# floor of log deducts 1 bit of n and the - 1, deducts the second bit.
- nbits = int(math.floor(math.log(n, 2))) - 1 # leave room for safebit
+ nbits = bit_size(n) - 2 # leave room for safebit
nbytes = nbits / 8
blocks = msglen / nbytes