diff options
author | Barry Mead <barrymead@cox.net> | 2010-02-21 14:56:41 -0700 |
---|---|---|
committer | Barry Mead <barrymead@cox.net> | 2010-02-21 14:56:41 -0700 |
commit | 60fb06ddbac89c83ad3cb6b9a2c3c42d19b7a709 (patch) | |
tree | 5cf9c2f69b97a62f0283f44bf4122e70b8792cd1 | |
parent | c915b229531e2dac19101504806994ace12846e3 (diff) | |
download | rsa-60fb06ddbac89c83ad3cb6b9a2c3c42d19b7a709.tar.gz |
Added bit_size function remove log clutter
-rw-r--r-- | rsa/__init__.py | 21 | ||||
-rw-r--r-- | rsa/fastrsa.py | 27 |
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 |