diff --git a/classes/helpers/EncryptionScheme.py b/classes/helpers/EncryptionScheme.py new file mode 100644 index 0000000000000000000000000000000000000000..a59d1ddde4a597946feca1454ccfbcb0317acc8b --- /dev/null +++ b/classes/helpers/EncryptionScheme.py @@ -0,0 +1,24 @@ +from sage.all import * + +from .SignatureScheme import SignatureScheme + + +class EncryptionScheme(SignatureScheme): + """Da EncryptionScheme von SignatureScheme erbt, stehen alle Funktionen zur Verfügung. + Wichtig ist auch hier, dass private_key und public_key gesetzt sind.""" + + def encrypt(self, message): + # da EncryptionScheme nicht direkt von PublicKey erbt wird + # die Verschlüsseling extra zur Verfügung gestellt + return self.public_key.encrypt(message) + + def decrypt(self, ciphertext): + # verhält sich analog zu SignatureScheme.sign(msg) + + # Sollte `ciphertext` eine Liste sein -> Typecast + if not isinstance(ciphertext, sage.structure.element.Vector): + ciphertext = vector(ciphertext) + + _t = self.private_key.T.inverse(ciphertext) + _p = self.invert_MQ(_t) + return self.private_key.S.inverse(_p) diff --git a/classes/helpers/PrivateKey.py b/classes/helpers/PrivateKey.py index 53d5f45b6d221ebd4e17886ad89896fe031887c1..6797c77666741526f27e36535cc4d6e77820bd84 100644 --- a/classes/helpers/PrivateKey.py +++ b/classes/helpers/PrivateKey.py @@ -6,51 +6,40 @@ from .PublicKey import PublicKey class PrivateKey(object): - """Private Key - AffineTransformation::S - PolynomialSystem::P - AffineTransformation::T - """ - - def __init__(self, S, P, T, path=None): - # type: (AffineTransformation, PolynomialSystem, AffineTransformation, - # String) -> None + def __init__(self, S, Pr, T, path=None): + # wird ein Schlüssel als Dateipfad übergeben, so wird dieser geladen if path is not None: (self.S, self.P, self.T) = self.load(path) - else: - self.S = S - self.P = P - self.T = T + + self.S = S # Affine Transformation + self.Pr = Pr # Polynomsystem + self.T = T # Affine Transformation def generate_public_key(self): - # type: (None) -> PublicKey + # in `x` sind die Variablen x1,...,xn x = vector(self.P[0].parent().gens()) - sx = list(self.S(x)) - public_poly = [] - for i in xrange(0, len(self.P)): - public_poly.append(self.P[i](sx)) - spt = self.T(vector(public_poly)) + # angewendet auf die Verschlüsselung ergibt + # dies das öffentliche Polynom + spt = self.encrypt(x) return PublicKey(spt) def encrypt(self, message): - # type: (Vector) -> Vector - x = list(self.S(vector(message))) - y = [] - for i in xrange(0, len(self.P)): - y.append(self.P[i](x)) + # Die Verschlüsselung wurde angepasst um nicht von + # dem PublicKey abzuhängen sondern von (S,Pr,T) + sx = list(self.S(vector(message))) + spx = self.Pr(list(sx)) + return self.T(spx) - return self.T(vector(y)) + """ Es folgt eine sehr einfache Möglichkeit den Schlüssel zu + speichern und entsprechend auch wieder zu laden """ def save(self, path="./keys/uov.priv"): - # type: (String) -> None with open(path, 'wb') as output: pickle.dump((self.S, self.P, self.T), output, pickle.HIGHEST_PROTOCOL) def load(self, path): - # type: (String) -> (AffineTransformation, PolynomialSystem, - # AffineTransformation) with open(path, 'rb') as output: return pickle.load(output) diff --git a/classes/helpers/PublicKey.py b/classes/helpers/PublicKey.py index 9d121a38e76b6222d9c8fa425a353c76685ec786..c6d75b2f4b9cc9e323553a36cb64b84b0a716d6f 100644 --- a/classes/helpers/PublicKey.py +++ b/classes/helpers/PublicKey.py @@ -4,7 +4,7 @@ import cPickle as pickle class PublicKey(object): def __init__(self, public_polynomial=None, path=None): - # wird ein Schlüssel als Datei übergeben, so wird dieser geladen + # wird ein Schlüssel als Dateipfad übergeben, so wird dieser geladen if public_polynomial is None and path is not None: self.P = self.load(path) else: diff --git a/classes/helpers/SignatureScheme.py b/classes/helpers/SignatureScheme.py index c9e5eadcaac0a9726ef72919915a0caf53f5c3b5..63e88815a24d3aff2565fcc1deffe5c07a4269c0 100644 --- a/classes/helpers/SignatureScheme.py +++ b/classes/helpers/SignatureScheme.py @@ -2,31 +2,27 @@ from sage.all import * class SignatureScheme(object): - """All Functions for an MQPKC Signature Scheme""" - """Init must set public and private keys""" + """ + SignatureScheme ist ein interface. Entprechend muss es zwingend + mit private_key und public_key initialisiert werden + """ def sign(self, msg): - """ - Idea: generate signature that __encrypts__ to hash(message) - private_key of form (S, P', T) - invert S, P' and T -> we write _S, _P' and _T - """ + '''generiere Signatur, die zu wieder zu msg `verschlüsselt`''' + + # Sollte `msg` eine Liste sein -> Typecast + if not isinstance(msg, sage.structure.element.Vector): + msg = vector(msg) + _t = self.private_key.T.inverse(msg) _p = self.invert_MQ(_t) return self.private_key.S.inverse(_p) def invert_MQ(self, msg): - """ - Every Scheme has to know how to invert the private polynomial - """ + '''Platzhalter für alle Signatur- und Verschlüsselungsverfahren''' raise NotImplementedError def verify(self, signature, msg): - """ - signature: vector of length n - msg: vector of length m - - for each entry of msg check: - msg[i] == P(signature) - """ + # da SignatureScheme nicht direkt von PublicKey erbt wird + # die Verifikation extra zur Verfügung gestellt return self.public_key.verify(signature, msg)