Should work now, except for finding primes, those are hardcoded lel

This commit is contained in:
Alexander Munch-Hansen 2019-09-18 17:39:54 +02:00
parent 1136f7eedc
commit a3ccefa441

View File

@ -8,22 +8,24 @@ from math import pow
import numpy as np import numpy as np
from crypto.week1 import BloodType, convert_from_string_to_enum, blood_cell_compatibility_lookup from crypto.week1 import BloodType, convert_from_string_to_enum, blood_cell_compatibility_lookup
# We can't encrypt 0, so we have to index from 1
convert_bloodtype_to_index = { convert_bloodtype_to_index = {
BloodType.O_NEGATIVE: 0, BloodType.O_NEGATIVE: 1,
BloodType.O_POSITIVE: 1, BloodType.O_POSITIVE: 2,
BloodType.A_NEGATIVE: 2, BloodType.A_NEGATIVE: 3,
BloodType.A_POSITIVE: 3, BloodType.A_POSITIVE: 4,
BloodType.B_NEGATIVE: 4, BloodType.B_NEGATIVE: 5,
BloodType.B_POSITIVE: 5, BloodType.B_POSITIVE: 6,
BloodType.AB_NEGATIVE: 6, BloodType.AB_NEGATIVE: 7,
BloodType.AB_POSITIVE: 7, BloodType.AB_POSITIVE: 8,
} }
class ElGamal: class ElGamal:
def __init__(self, g, q): def __init__(self, g, q, p):
self.gen_ = g self.gen_ = g
self.order = q self.order = q
self.p = p
self.pk = None self.pk = None
self.sk = None self.sk = None
@ -42,8 +44,8 @@ class ElGamal:
def enc(self, m, pk): def enc(self, m, pk):
# sample random r \in Zq # sample random r \in Zq
r = SystemRandom().randint(1, q) r = SystemRandom().randint(1, q)
g, h = pk g, h = pk
s = (h**r) % q s = (h**r) % q
p = (g**r) % q p = (g**r) % q
c = s * m c = s * m
@ -56,7 +58,7 @@ class ElGamal:
m = c1 / h m = c1 / h
return m return m
def ogen(self, r): def ogen(self):
# Here, q = 2p+1, thus we actually need to use the p here, instead of # Here, q = 2p+1, thus we actually need to use the p here, instead of
# self.order, but as we do not know p yet, .e we # self.order, but as we do not know p yet, .e we
# TODO: Use p instead of self.order, s.t. self.order = 2p+1 # TODO: Use p instead of self.order, s.t. self.order = 2p+1
@ -68,22 +70,22 @@ class ElGamal:
class Alice: class Alice:
def __init__(self, bloodtype, elgamal): def __init__(self, bloodtype, elgamal):
self.elgamal = elgamal self.elgamal = elgamal
self.gen_ = 9
self.order = 453
self.b = convert_bloodtype_to_index[convert_from_string_to_enum[bloodtype]]
self.sk = SystemRandom().randint(1, self.order)
self.pk = self.elgamal.gen(self.sk) self.sk = elgamal.gen_key()
self.fake_pks = [self.elgamal.ogen(SystemRandom().randint(0, self.order))
self.pk = elgamal.gen(self.sk)
self.b = convert_bloodtype_to_index[convert_from_string_to_enum[bloodtype]]
self.fake_pks = [self.elgamal.ogen()
for _ in range(7)] for _ in range(7)]
def send_pks(self): def send_pks(self):
all_pks = self.fake_pks all_pks = self.fake_pks
all_pks.insert(self.b, self.pk) all_pks.insert(self.b-1, self.pk)
return all_pks return all_pks
def retrieve(self, ciphers): def retrieve(self, ciphers):
mb = self.elgamal.dec(ciphers[self.b]) mb = self.elgamal.dec(ciphers[self.b-1])
return mb return mb
@ -114,15 +116,14 @@ if __name__ == "__main__":
q = 2*p + 1 q = 2*p + 1
g = SystemRandom().randint(2, q) g = SystemRandom().randint(2, q)
elgamal = ElGamal(g, q) elgamal = ElGamal(g, q, p)
sk = elgamal.gen_key() alice = Alice("B-", elgamal)
bob = Bob("B-", elgamal)
bob.receive_pks(alice.send_pks())
pls = alice.retrieve(bob.transfer_messages())
print(pls)
m = 7
pk = elgamal.gen(sk)
c = elgamal.enc(m, pk)
print(c)
d_m = elgamal.dec(c)
print("decrupted:", d_m)