home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __revision__ = '$Id: ElGamal.py,v 1.9 2003/04/04 19:44:26 akuchling Exp $'
- from Crypto.PublicKey.pubkey import *
- from Crypto.Util import number
-
- class error(Exception):
- pass
-
-
- def generate(bits, randfunc, progress_func = None):
- obj = ElGamalobj()
- if progress_func:
- progress_func('p\n')
-
- obj.p = bignum(getPrime(bits, randfunc))
- if progress_func:
- progress_func('g\n')
-
- size = bits - 1 - (ord(randfunc(1)) & 63)
- if size < 1:
- size = bits - 1
-
- while None:
- obj.g = bignum(getPrime(size, randfunc))
- if obj.g < obj.p:
- break
-
- size = (size + 1) % bits
- if size == 0:
- size = 4
- continue
- continue
- if progress_func:
- progress_func('x\n')
-
- while None:
- size = bits - 1 - ord(randfunc(1))
- if size > 2:
- break
- continue
- continue
- while None:
- obj.x = bignum(getPrime(size, randfunc))
- if obj.x < obj.p:
- break
-
- size = (size + 1) % bits
- if size == 0:
- size = 4
- continue
- continue
- if progress_func:
- progress_func('y\n')
-
- obj.y = pow(obj.g, obj.x, obj.p)
- return obj
-
-
- def construct(tuple):
- obj = ElGamalobj()
- if len(tuple) not in (3, 4):
- raise error, 'argument for construct() wrong length'
- len(tuple) not in (3, 4)
- for i in range(len(tuple)):
- field = obj.keydata[i]
- setattr(obj, field, tuple[i])
-
- return obj
-
-
- class ElGamalobj(pubkey):
- keydata = [
- 'p',
- 'g',
- 'y',
- 'x']
-
- def _encrypt(self, M, K):
- a = pow(self.g, K, self.p)
- b = M * pow(self.y, K, self.p) % self.p
- return (a, b)
-
-
- def _decrypt(self, M):
- if not hasattr(self, 'x'):
- raise error, 'Private key not available in this object'
- hasattr(self, 'x')
- ax = pow(M[0], self.x, self.p)
- plaintext = M[1] * inverse(ax, self.p) % self.p
- return plaintext
-
-
- def _sign(self, M, K):
- if not hasattr(self, 'x'):
- raise error, 'Private key not available in this object'
- hasattr(self, 'x')
- p1 = self.p - 1
- if GCD(K, p1) != 1:
- raise error, 'Bad K value: GCD(K,p-1)!=1'
- GCD(K, p1) != 1
- a = pow(self.g, K, self.p)
- t = (M - self.x * a) % p1
- while t < 0:
- t = t + p1
- b = t * inverse(K, p1) % p1
- return (a, b)
-
-
- def _verify(self, M, sig):
- v1 = pow(self.y, sig[0], self.p)
- v1 = v1 * pow(sig[0], sig[1], self.p) % self.p
- v2 = pow(self.g, M, self.p)
- if v1 == v2:
- return 1
- return 0
-
-
- def size(self):
- return number.size(self.p) - 1
-
-
- def has_private(self):
- if hasattr(self, 'x'):
- return 1
- return 0
-
-
- def publickey(self):
- return construct((self.p, self.g, self.y))
-
-
- object = ElGamalobj
-