def generateKeys(security_level = 1): prime_size, random_size = 0, 0 if security_level == 1: prime_size, random_size = 160, 864 elif security_level == 2: prime_size, random_size = 224, 1824 elif security_level == 3: prime_size, random_size = 256, 2816 else: return q = number.getPrime(prime_size) k = number.getRandomInteger(random_size) p = k * q + 1 while utils.rm_primality(p) != True: k = utils.gen_random(random_size) p = k * q + 1 a = number.getRandomRange(0, p) g = utils.mod_exp(a, (p - 1) / q, p) while g == 1: a = number.getRandomRange(0, p) g = utils.mod_exp(a, (p - 1) / q, p) x = number.getRandomRange(1, q - 2) y = utils.mod_exp(g, x, p) return p, q, g, x, y
def verifySignature(p, q, g, y, r, s, message): if r <= 0 or r >= q or s <= 0 or s >= q: print "Rejected!" return H = int(hexlify(CryptoBox.generateHash(message, 1)), 16) w = utils.inverse(s, q) u1 = (H * w) % q u2 = (r * w) % q v = ((utils.mod_exp(g, u1, p) * utils.mod_exp(y, u2, p)) % p) % q return True if v == r else False
def generateSignature(p, q, g, x, message): H = int(hexlify(CryptoBox.generateHash(message, 1)), 16) k = number.getRandomRange(1, q) r = utils.mod_exp(g, k, p) % q k_inv = utils.inverse(k, q) s = (k_inv * (H + x * r)) % q if (r == 0 or s == 0): # since it is very unlikely to make a recursive call, function will terminate eventually return generateSignature(p, q, g, x, message) return r, s
def RSAEP(N, e, m): if m < 0 or m > N - 1: print "Message representative out of range!" return -1 return utils.mod_exp(m, e, N)
def RSAVP1(N, e, s): if s < 0 or s > N - 1: print "Signature representative out of range" return return utils.mod_exp(s, e, N)
def RSASP1(N, d, m): if m < 0 or m > N - 1: print "Message representative out of range" return return utils.mod_exp(m, d, N)
def RSADP(N, d, c): if c < 0 or c > N - 1: print "Ciphertext representative out of range" return return utils.mod_exp(c, d, N)
def decrypt(p, q, x, r, t): k = utils.inverse(utils.mod_exp(r, x, p), p) message = (t * k) % p return message
def encrypt(p, q, g, y, message): k = number.getRandomRange(1, p - 2) r = utils.mod_exp(g, k, p) t = (utils.mod_exp(y, k, p) * message) % p return r, t