from curves import get_curve
from elliptic import mulp
from encoding import enc_long
from random import SystemRandom
from Rabbit import Rabbit
random = SystemRandom()
def encrypt(message, qk, encrypter = Rabbit):
bits, q = qk
try:
bits, cn, n, cp, cq, g = get_curve(bits)
if not n:
raise ValueError, "Key size %s not suitable for encryption" % bits
except KeyError:
raise ValueError, "Key size %s not implemented" % bits
k = random.randint(1, n - 1) kg = mulp(cp, cq, cn, g, k) sg = mulp(cp, cq, cn, q, k)
return encrypter(enc_long(sg[0])).encrypt(message), kg
def decrypt(message, kg, dk, decrypter = Rabbit):
bits, d = dk
try:
bits, cn, n, cp, cq, g = get_curve(bits)
except KeyError:
raise ValueError, "Key size %s not implemented" % bits
sg = mulp(cp, cq, cn, kg, d) return decrypter(enc_long(sg[0])).decrypt(message)