home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2248 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  4.3 KB  |  135 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __revision__ = '$Id: ElGamal.py,v 1.9 2003/04/04 19:44:26 akuchling Exp $'
  5. from Crypto.PublicKey.pubkey import *
  6. from Crypto.Util import number
  7.  
  8. class error(Exception):
  9.     pass
  10.  
  11.  
  12. def generate(bits, randfunc, progress_func = None):
  13.     obj = ElGamalobj()
  14.     if progress_func:
  15.         progress_func('p\n')
  16.     
  17.     obj.p = bignum(getPrime(bits, randfunc))
  18.     if progress_func:
  19.         progress_func('g\n')
  20.     
  21.     size = bits - 1 - (ord(randfunc(1)) & 63)
  22.     if size < 1:
  23.         size = bits - 1
  24.     
  25.     while None:
  26.         obj.g = bignum(getPrime(size, randfunc))
  27.         if obj.g < obj.p:
  28.             break
  29.         
  30.         size = (size + 1) % bits
  31.         if size == 0:
  32.             size = 4
  33.             continue
  34.         continue
  35.         if progress_func:
  36.             progress_func('x\n')
  37.         
  38.     while None:
  39.         size = bits - 1 - ord(randfunc(1))
  40.         if size > 2:
  41.             break
  42.             continue
  43.         continue
  44.         while None:
  45.             obj.x = bignum(getPrime(size, randfunc))
  46.             if obj.x < obj.p:
  47.                 break
  48.             
  49.             size = (size + 1) % bits
  50.             if size == 0:
  51.                 size = 4
  52.                 continue
  53.             continue
  54.             if progress_func:
  55.                 progress_func('y\n')
  56.             
  57.     obj.y = pow(obj.g, obj.x, obj.p)
  58.     return obj
  59.  
  60.  
  61. def construct(tuple):
  62.     obj = ElGamalobj()
  63.     if len(tuple) not in (3, 4):
  64.         raise error, 'argument for construct() wrong length'
  65.     len(tuple) not in (3, 4)
  66.     for i in range(len(tuple)):
  67.         field = obj.keydata[i]
  68.         setattr(obj, field, tuple[i])
  69.     
  70.     return obj
  71.  
  72.  
  73. class ElGamalobj(pubkey):
  74.     keydata = [
  75.         'p',
  76.         'g',
  77.         'y',
  78.         'x']
  79.     
  80.     def _encrypt(self, M, K):
  81.         a = pow(self.g, K, self.p)
  82.         b = M * pow(self.y, K, self.p) % self.p
  83.         return (a, b)
  84.  
  85.     
  86.     def _decrypt(self, M):
  87.         if not hasattr(self, 'x'):
  88.             raise error, 'Private key not available in this object'
  89.         hasattr(self, 'x')
  90.         ax = pow(M[0], self.x, self.p)
  91.         plaintext = M[1] * inverse(ax, self.p) % self.p
  92.         return plaintext
  93.  
  94.     
  95.     def _sign(self, M, K):
  96.         if not hasattr(self, 'x'):
  97.             raise error, 'Private key not available in this object'
  98.         hasattr(self, 'x')
  99.         p1 = self.p - 1
  100.         if GCD(K, p1) != 1:
  101.             raise error, 'Bad K value: GCD(K,p-1)!=1'
  102.         GCD(K, p1) != 1
  103.         a = pow(self.g, K, self.p)
  104.         t = (M - self.x * a) % p1
  105.         while t < 0:
  106.             t = t + p1
  107.         b = t * inverse(K, p1) % p1
  108.         return (a, b)
  109.  
  110.     
  111.     def _verify(self, M, sig):
  112.         v1 = pow(self.y, sig[0], self.p)
  113.         v1 = v1 * pow(sig[0], sig[1], self.p) % self.p
  114.         v2 = pow(self.g, M, self.p)
  115.         if v1 == v2:
  116.             return 1
  117.         return 0
  118.  
  119.     
  120.     def size(self):
  121.         return number.size(self.p) - 1
  122.  
  123.     
  124.     def has_private(self):
  125.         if hasattr(self, 'x'):
  126.             return 1
  127.         return 0
  128.  
  129.     
  130.     def publickey(self):
  131.         return construct((self.p, self.g, self.y))
  132.  
  133.  
  134. object = ElGamalobj
  135.