diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..2784befe3acc1a61ddc92a6baf14ec3c7ba03810 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="ES6" /> + </component> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.5 (venv)" project-jdk-type="Python SDK" /> +</project> \ No newline at end of file diff --git a/ITKoin_01_Prajczer_Peter.py b/ITKoin_01_Prajczer_Peter.py index 17eabef07e00afc644b8f04bc6b96f465075ac28..17d0f2273650549cf03f86e3ad1db119a4d0a436 100644 --- a/ITKoin_01_Prajczer_Peter.py +++ b/ITKoin_01_Prajczer_Peter.py @@ -1,5 +1,7 @@ +from Crypto.Hash import SHA256 from Crypto.PublicKey import RSA import json +from Crypto.Signature import pkcs1_15 from base64 import b64encode, b64decode from pprint import pprint @@ -16,27 +18,95 @@ class ITKoin: # generálj 2048 bites RSA kulcsot rsakey = RSA.generate(2048) # a kulcs publikus része kerüljön ide - rsapublickey = rsakey.publickey().export_key() - # # print(rsakey) - # # pprint(rsakey) - # # print(vars(rsakey)) - # # pprint(vars(rsakey)) - # pprint(vars(rsakey)) - # pprint(vars(rsapublickey)) - # PEMrsakey = # PEM formátumra alakítsd az RSA kulcsot - # pprint(PEMrsakey) - # PEMrsapublickey = # PEM formátumra alakítsd a kulcs publikus részét - # pprint(PEMrsapublickey) - # privatekeyfilename = filename + 'priv.pem' - # f = open(privatekeyfilename, 'wb') - # f.write(PEMrsakey) - # f.close() - # publickeyfilename = filename + 'pub.pem' - # f = open(publickeyfilename, 'wb') - # f.write(PEMrsapublickey) - # f.close() - return + rsapublickey = rsakey.publickey() + # print(rsakey) + # print(rsakey) + # print(vars(rsakey)) + # print(vars(rsakey)) + # print(vars(rsakey)) + # print(vars(rsapublickey)) + # PEM formátumra alakítsd az RSA kulcsot + PEMrsakey = rsakey.export_key('PEM') + # print(PEMrsakey) + # PEM formátumra alakítsd a kulcs publikus részét + PEMrsapublickey = rsapublickey.export_key("PEM") + # print(PEMrsapublickey) + privatekeyfilename = filename + 'priv.pem' + f = open(privatekeyfilename, 'wb') + f.write(PEMrsakey) + f.close() + publickeyfilename = filename + 'pub.pem' + f = open(publickeyfilename, 'wb') + f.write(PEMrsapublickey) + f.close() + + def load_key(self, filename): + privatekeyfilename = filename + 'priv.pem' + privatekeyfileobject = open(privatekeyfilename, 'r') + privatekeyfilecontent = privatekeyfileobject.read() + # print(privatekeyfilecontent) + rsakey = RSA.import_key(privatekeyfilecontent) + self.rsakey = rsakey + # pprint(vars(self.rsakey)) + rsapublickey = rsakey.publickey() + self.rsapublickey = rsapublickey + # print("haha") + # pprint(vars(self.rsapublickey)) + + def load_public_key(self, filename): + publickeyfilename = filename + 'pub.pem' + publickeyfileobject = open(publickeyfilename, 'r') + publickeyfilecontent = publickeyfileobject.read() + # pprint(publickeyfilecontent) + rsakey = RSA.import_key(publickeyfilecontent) + rsapublickey = rsakey.publickey() + self.rsapublickey = rsapublickey + # pprint(vars(self.rsapublickey)) + + + @staticmethod + def create_hashobject(data): + stringdump = json.dumps(data) # ez nem teljesen korrekt megoldás, de így egyszerű mindent byte stringgé konvertálni + binarydump = stringdump.encode() + # hozz létre egy hash objektumot + hashobject = SHA256.new() + # töltsd be az objektumba a lenyomatolni kívánt byte stringet + hashhexvalue = hashobject.update(binarydump) + # print(hashobject) + # print(hashhexvalue) + return hashobject + + def create_signature(self, data): + # hozz létre egy signature objektumot + signatureobject = pkcs1_15.new(self.rsakey) + # az adatot töltsd be egy hash objektumba a create_hashobject(data) használatával + hashobject = self.create_hashobject(data) + # készítsd el az aláírás értéket a sign függvénnyel + signaturevalue = signatureobject.sign(hashobject) + print(signaturevalue) + b64signaturevalue = b64encode(signaturevalue) + print(b64signaturevalue) + print(b64signaturevalue.decode()) + return b64signaturevalue.decode() + + def verify_signature(self, data, b64signaturevalue, rsapublickey): + # hozz létre egy verify objektumot + verifyobject = pkcs1_15.new(rsapublickey) + # az adatot töltsd be egy hash objektumba a create_hashobject(data) használatával + hashobject = self.create_hashobject(data) + # dekódold base64 kódolással az aláírás értéket + signaturevalue = b64decode(b64signaturevalue) + signatureerror = verifyobject.verify(signaturevalue, hashobject) + # értéke: True, ha az aláírás érvényes + validsignature = True + return validsignature if __name__ == '__main__': test_coin = ITKoin() + # test_coin.generate_rsa_key("prajczer") + test_coin.load_key("prajczer") + test_coin.load_public_key("prajczer") + test_coin.create_hashobject("random") + test_coin.create_signature('random') + test_coin.verify_signature(@fasz kivan)