· 7 years ago · Apr 30, 2018, 05:50 PM
1#!/bin/env python
2# -*- coding: utf-8 -*-
3
4'''
5homomorphic encryption using ElGamal
6'''
7
8
9GLOBAL=25
10PRIME=997
11SECRET_KEY=20
12
13
14class ElGamal:
15 def __init__(self, g, p, r, x):
16 self.g = g # global
17 self.p = p # prime
18 self.r = r # random
19 self._x = x # secret key
20 self.y = (g ** x) % p # public key
21
22 def enc(self, m):
23 c1 = (self.g ** self.r) % self.p
24 c2 = m * ((self.y ** self.r)) % self.p
25 return (c1, c2)
26
27 def dec(self, c1, c2):
28 return (c2 * (c1 ** (self.p - 1 - self._x))) % self.p
29
30
31if __name__ == '__main__':
32 elgamal_a = ElGamal(GLOBAL, PRIME, 14, SECRET_KEY)
33 elgamal_b = ElGamal(GLOBAL, PRIME, 33, SECRET_KEY)
34 assert elgamal_a.dec(*elgamal_a.enc(10)) == 10
35 assert elgamal_a.dec(*elgamal_a.enc(12)) == 12
36 assert elgamal_b.dec(*elgamal_b.enc(20)) == 20
37 assert elgamal_b.dec(*elgamal_b.enc(22)) == 22
38
39 c1, c2 = elgamal_a.enc(2)
40 assert elgamal_a.dec(*(c1, c2 * 3)) == 6
41 assert elgamal_a.dec(*(c1, c2 * 8)) == 16
42 assert elgamal_a.dec(*(c1, c2 * 11)) == 22
43 assert elgamal_a.dec(*(c1, c2 * 15)) == 30
44
45 c1a, c2a = elgamal_a.enc(4)
46 c1b, c2b = elgamal_b.enc(19)
47 c1 = c1a * c1b
48 c2 = c2a * c2b
49 assert elgamal_a.dec(*(c1, c2)) == 76
50 assert elgamal_b.dec(*(c1, c2)) == 76