diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..caa23c77b1db2e267c9c74e952e9256c5ce25f14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.idea/ +*.pem +*.xml +/machvenv diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 2784befe3acc1a61ddc92a6baf14ec3c7ba03810..0000000000000000000000000000000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?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 17d0f2273650549cf03f86e3ad1db119a4d0a436..23d9321f12a872d0056cf9dac4206d73d97adc46 100644 --- a/ITKoin_01_Prajczer_Peter.py +++ b/ITKoin_01_Prajczer_Peter.py @@ -61,6 +61,7 @@ class ITKoin: rsakey = RSA.import_key(publickeyfilecontent) rsapublickey = rsakey.publickey() self.rsapublickey = rsapublickey + return rsapublickey # pprint(vars(self.rsapublickey)) @@ -93,20 +94,22 @@ class ITKoin: # 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) + 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 + signaturevalue = b64decode(b64signaturevalue) + # ellenőrizd az aláírást + try: + verifyobject.verify(hashobject, signaturevalue) + except ValueError: + return False + return True if __name__ == '__main__': test_coin = ITKoin() # test_coin.generate_rsa_key("prajczer") test_coin.load_key("prajczer") - test_coin.load_public_key("prajczer") + rsapublickey = test_coin.load_public_key("prajczer") test_coin.create_hashobject("random") - test_coin.create_signature('random') - test_coin.verify_signature(@fasz kivan) + signo = test_coin.create_signature('random') + test_coin.verify_signature('random', signo, rsapublickey ) diff --git a/ITKoin_02_Prajczer_Peter.py b/ITKoin_02_Prajczer_Peter.py new file mode 100644 index 0000000000000000000000000000000000000000..454af09474babb801258f00ab707610a234799af --- /dev/null +++ b/ITKoin_02_Prajczer_Peter.py @@ -0,0 +1,274 @@ +from Crypto.PublicKey import RSA +from Crypto.Signature import pkcs1_15 +from Crypto.Hash import SHA256 +import json +from base64 import b64encode, b64decode +from pprint import pprint +import pickle + + + +class ITKoin: + def __init__ (self): + self.chain_filename = 'chain_01.txt' + self.pending_transactions_filename = 'pending_01.txt' + self.unspent_outputs_filename = 'unspent_01.txt' + self.my_privatekey_filename = 'csmkey_03_priv.pem' + self.chain = [] + self.pending_transactions = [] + self.unspent_outputs = [] + self.my_unspent_outputs = [] +# self.my_privatekey +# self.my_publickey +# self.my_id + # Ez egy lista, ahová s résztvevők id-jait tartalmazó file-neveket kell felsorolni + # mindegyikben benne van a publikus kulcs lenyomata, ezek az egyenek + + self.ITKoin_users = ['csmkey_03_id.txt', 'csmkey_04_id.txt'] + self.initial_csaposhi_offering = 100 + + + def generate_rsa_key(self, filename): # a filenév tövével kell meghívni és három file-t generál: a privát és publikus kulcsoknak, ill. az ID-nak + key = RSA.generate(2048) + publickey = key.publickey() + privatekey_filename = filename + '_priv.pem' + f = open(privatekey_filename, 'wb') + f.write(key.export_key()) + f.close() + publickey_filename = filename + '_pub.pem' + f = open(publickey_filename, 'wb') + f.write(publickey.export_key()) + f.close() + publickey_string = publickey.export_key().decode('ascii') # bináris stringet karakter stringgé konvertáljuk, hogy a json.dumps működjön rajta + recipient_id_filename = filename + '_id.txt' + f = open(recipient_id_filename, 'wb') + f.write(self.create_hashhexvalue(publickey_string).encode('ascii')) # a hexa string hash értéket bináris stringgé konvertáljuk a file-ba íráshoz + f.close() + return + + def load_my_private_key (self): + fileobject = open(self.my_privatekey_filename, 'r') + self.my_privatekey = RSA.import_key(fileobject.read()) + self.my_publickey = self.my_privatekey.publickey() + publickey_string = self.my_publickey.export_key().decode('ascii') # bináris stringet karakter stringgé konvertáljuk, hogy a json.dumps működjön rajta + self.my_id = self.create_hashhexvalue(publickey_string) # a hexa string hash értéket bináris stringgé konvertáljuk a file-ba íráshoz + pprint(self.my_id) + return + + @staticmethod + def load_public_key (filename): + fileobject = open(filename, 'r') + key = RSA.import_key(fileobject.read()) + return key.publickey() + + @staticmethod + def load_id (filename): + fileobject = open(filename, 'r') + id = fileobject.read() + return id + + @staticmethod + def create_hashobject (data): + stringdump = json.dumps(data) + hashobject = SHA256.new(stringdump.encode()) + return hashobject + + @staticmethod + def create_hashhexvalue (data): + stringdump = json.dumps(data) + hashobject = SHA256.new(stringdump.encode()) + return hashobject.hexdigest() + + @staticmethod + def create_hashvalue (data): + stringdump = json.dumps(data) + hashobject = SHA256.new(stringdump.encode()) + return hashobject.digest() + + def create_signature (self, data): + signatureobject = pkcs1_15.new(self.my_privatekey) # hozz létre egy signature objektumot + hashobject = self.create_hashobject(data) # az adatot töltsd be egy hash objektumba a create_hashobject(data) használatával + signaturevalue = signatureobject.sign(hashobject) # készítsd el az aláírás értéket a sign függvénnyel + # print(signaturevalue) + b64signaturevalue = b64encode(signaturevalue) # kódold base64 kódolással + # print(b64signaturevalue) + # print(b64signaturevalue.decode()) + return b64signaturevalue.decode() + + def verify_signature(self, data, b64signaturevalue, rsapublickey): + verifyobject = pkcs1_15.new(rsapublickey) # hozz létre egy verify objektumot + hashobject = self.create_hashobject(data) # az adatot töltsd be egy hash objektumba a create_hashobject(data) használatával + signaturevalue = b64decode(b64signaturevalue.encode()) # dekódold base64 kódolással az aláírás értéket + signatureerror = verifyobject.verify(hashobject, signaturevalue) # ellenőrizd az aláírást + validsignature = not signatureerror # értéke: True, ha az aláírás érvényes + return validsignature + + @staticmethod + def save_list(list, filename): + f = open(filename, 'wb') + pickle.dump(list, f) + f.close() + return + + # ide kell majd irni a hazit, hogy ellenorizuk a betoltott chaint + def load_chain(self): + fileobject = open(self.chain_filename, 'rb') + self.chain = pickle.load(fileobject) + print("\n BETOLTOTT CHAIN \n") + pprint(self.chain) + return + + # itt kell ellenorzini, hogy az ossze tranzakcio valid, es a blokkba bekerulhet + def load_pending_transactions(self): + fileobject = open(self.pending_transactions_filename, 'rb') + self.pending_transactions = pickle.load(fileobject) + print("\n BETOLTOTT PENDING TRANSACTIONS \n") + pprint(self.pending_transactions) + # a validated_pending_transactionskell majd belerakni + validated_pending_transactions = [] + while len(self.pending_transactions) != 0: + transaction = self.pending_transactions.pop() + if True: # itt validálni kellene az adott tranzakciót, a nem érvényeseket eldobja, de nem áll le + validated_pending_transactions.append(transaction) + self.pending_transactions = validated_pending_transactions + return + + # itt azokat szedjuk ki amelyik szerepel mint bevetel, minden tranzkcion ami a mi ID/nk van, + # tipikusank minden outputban 2 van + def find_unspent_outputs(self): + self.unspent_outputs = [] + self.my_unspent_outputs = [] + for transaction in self.chain[0]['transactions']: + self.unspent_outputs.append([transaction['txid'], 0, self.initial_csaposhi_offering]) + for output in transaction['outputs']: + if output['recipient']==self.my_id: + self.my_unspent_outputs.append([transaction['txid'], 0, output['csaposhi']]) + for block in self.chain[1:]: + for transaction in block['transactions']: + for output in transaction['outputs']: + self.unspent_outputs.append([transaction['txid'], transaction['outputs'].index(output), output['csaposhi']]) + if output['recipient'] == self.my_id: + self.my_unspent_outputs.append([transaction['txid'], transaction['outputs'].index(output), output['csaposhi']]) + for input in transaction['inputs']: + self.unspent_outputs.remove(input[0:3]) # minden input biztosan szerepelt a lánc korábbi outputjaként + if input[0:3] in self.my_unspent_outputs: # a remove() hibát dob, ha úgy törlünk a listából valamit, hogy nem is volt benne + self.my_unspent_outputs.remove(input[0:3]) + print("\n EL NEM KOLTOTT KIMENETEK \n") + pprint(self.unspent_outputs) + print("\n EN EL NEM KOLTOTT KIMENETEIM") + pprint(self.my_unspent_outputs) + return + + def mine(self): + if len(self.chain) == 0: + # legelso blocknak mindig ez lesz az eleje, ez jelzi, hogy az elso: ide lehet ellenorizni, hogy nehogy ilyen legyen a hash lenyomata az uj blokknak + previous_block_header_hash = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + else: + previous_block = self.chain[-1] + previous_block_header = previous_block['block_header'] + previous_block_header_hash = self.create_hashhexvalue(previous_block_header) + + nonce = 0 + + block_header = { + 'nonce': nonce, + 'previous_block_header_hash': previous_block_header_hash, + 'transactions_hash' : self.create_hashhexvalue(self.pending_transactions), + } + # ez itt a konkret banyaszas, keressuk a jo lenyomatot + while True: + block_header_hash = self.create_hashhexvalue(block_header) + if block_header_hash[:4] == "0000": + break + block_header['nonce'] += 1 + + block = { + 'block_header': block_header, + 'transactions': self.pending_transactions + } + print("\n blokkunk: \n") + pprint(block) + + self.chain.append(block) + print("\n chain: \n") + pprint (self.chain) + self.save_list(self.chain, self.chain_filename) + self.pending_transactions = [] + self.save_list(self.pending_transactions, self.pending_transactions_filename) + return + + def generate_first_block(self): + self.pending_transactions = [] + while len(self.ITKoin_users) > 0: + recipient_id = self.load_id (self.ITKoin_users.pop()) # előveszi a következő id file nevét és beolvassa az id-t + # csaposhi meg a recipientbol generaljuk a tranzakcio ID-t!! + for tr in self.pending_transactions: # nem szerepelhet kétszer ugyanaz a recipient, mert akkor a tranzakcio azonos lesz + for op in tr['outputs']: + if recipient_id == op['recipient']: + pprint ('HIBA: Ismétlődő recipient adatok az első blokk generálásakor.') + return False + outputs = [{ + 'csaposhi': self.initial_csaposhi_offering, + 'recipient': recipient_id}] + transaction = { + 'inputs': [], + 'outputs': outputs} + transaction ['txid'] = self.create_hashhexvalue(transaction) # a tranzakció lenyomata lesz az azonosítója egyben + self.pending_transactions.append(transaction) + print("\n PENDING TRANSACTIONS \n") + pprint(self.pending_transactions) + self.mine() + return + + def new_transaction(self, csaposhi, recipient): # a megadott összeg átadása recipientnek, a maradék visszautalása + sum = 0 + used_outputs=[] + while (sum < csaposhi): + next_output=self.my_unspent_outputs.pop() + # pprint(next_output) + used_outputs.append(next_output) + # pprint(next_output) + sum += next_output[2] # ebben a listapozícióban van a hivatkozott outputban kapott összeg + print("\n TELJES OSSZEG \n") + pprint(sum) + inputs = used_outputs + pprint(inputs) + for input in inputs: # az inputsban szándékosan nincs benne az akkori recipient, mert ezt abból a tranzakcióból kell kivenni és ellenőrizni + input.append(self.create_signature(input[0])) # input[3] az aláírás érték base64 kódolással + input.append(self.my_publickey.export_key().decode('ascii')) # input[4] a publikus kulcsom PEM formátumban + print("\n SIGNATURE ELLENORZES \n") + pprint(self.verify_signature(input[0], input[3], RSA.import_key(input[4]))) + outputs = [{ + 'csaposhi': csaposhi, + 'recipient': recipient}] + if sum > csaposhi: # ha van visszajáró, azt visszautaljuk magunknak + outputs.append({ + 'csaposhi': sum-csaposhi, + 'recipient': self.my_id}) + transaction = { + 'inputs': inputs, + 'outputs': outputs} + transaction ['txid'] = self.create_hashhexvalue(transaction) # a tranzakció lenyomata lesz az azonosítója egyben + self.pending_transactions.append(transaction) + print("\n PENDING TRANSACTIONS \n") + pprint(self.pending_transactions) + return + + +if __name__ == '__main__': + mycoin=ITKoin() + # mycoin.generate_rsa_key('csmkey_03') + # mycoin.generate_rsa_key('csmkey_04') + # mycoin.generate_first_block() + mycoin.load_my_private_key() + mycoin.load_chain() + mycoin.find_unspent_outputs() + # mycoin.new_transaction(20, 'e64bcaefab6b9e1a88447f399d35959a3f0015e2cf48a9ebb866bfe368d3e55c') + mycoin.mine() + # signature = mycoin.create_signature(2) + # pprint(signature) + # pprint(mycoin.my_publickey) + # print(mycoin.verify_signature(2, signature, mycoin.my_publickey)) + + mycoin.mine() + diff --git a/JKk/jegyzokonyv_-01_prajczerpeter.pdf b/JKk/jegyzokonyv_-01_prajczerpeter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3a4112f95dec80092058c6783e7906cd41eedf05 Binary files /dev/null and b/JKk/jegyzokonyv_-01_prajczerpeter.pdf differ diff --git a/_linux/laf.xml b/_linux/laf.xml deleted file mode 100644 index c1f98d9513689c94fea71c8419b5d574b69a5484..0000000000000000000000000000000000000000 --- a/_linux/laf.xml +++ /dev/null @@ -1,5 +0,0 @@ -<application> - <component name="LafManager"> - <laf class-name="com.intellij.ide.ui.laf.darcula.DarculaLaf" /> - </component> -</application> \ No newline at end of file diff --git a/chain_01.txt b/chain_01.txt new file mode 100644 index 0000000000000000000000000000000000000000..4087765558b994111b0b3729ec4e112b4d82f37c Binary files /dev/null and b/chain_01.txt differ diff --git a/codestyles/Default.xml b/codestyles/Default.xml deleted file mode 100644 index e94f32a8c528ea144c4fa1214dc75ee997b2382e..0000000000000000000000000000000000000000 --- a/codestyles/Default.xml +++ /dev/null @@ -1 +0,0 @@ -<code_scheme name="Default" version="173" /> \ No newline at end of file diff --git a/colors.scheme.xml b/colors.scheme.xml deleted file mode 100644 index 39308cdb16bb241cfd7f76f54f89479ea0f52b35..0000000000000000000000000000000000000000 --- a/colors.scheme.xml +++ /dev/null @@ -1,5 +0,0 @@ -<application> - <component name="EditorColorsManagerImpl"> - <global_color_scheme name="Darcula" /> - </component> -</application> \ No newline at end of file diff --git a/csmkey_03_id.txt b/csmkey_03_id.txt new file mode 100644 index 0000000000000000000000000000000000000000..5a01fc6250a506d2a1222f49245e0f4d5a4bb858 --- /dev/null +++ b/csmkey_03_id.txt @@ -0,0 +1 @@ +028f631b828c8c5c83f80cd8a195b6dd2e129fd5ff5c6a7f511060aa7e7ff1b0 \ No newline at end of file diff --git a/csmkey_04_id.txt b/csmkey_04_id.txt new file mode 100644 index 0000000000000000000000000000000000000000..62479c3adb19d4457dd3678a0f5878993c607949 --- /dev/null +++ b/csmkey_04_id.txt @@ -0,0 +1 @@ +e64bcaefab6b9e1a88447f399d35959a3f0015e2cf48a9ebb866bfe368d3e55c \ No newline at end of file diff --git a/debugger.xml b/debugger.xml deleted file mode 100644 index 544ab155e35bc4e2b79741cfbf67c0036ffe5257..0000000000000000000000000000000000000000 --- a/debugger.xml +++ /dev/null @@ -1,13 +0,0 @@ -<application> - <component name="XDebuggerSettings"> - <data-views /> - <general /> - <debuggers> - <debugger id="javascript"> - <configuration> - <custom-object-presentation /> - </configuration> - </debugger> - </debuggers> - </component> -</application> \ No newline at end of file diff --git a/inspection/Default.xml b/inspection/Default.xml deleted file mode 100644 index da0c24fdff1cb69b65963dd17d8cda91371add22..0000000000000000000000000000000000000000 --- a/inspection/Default.xml +++ /dev/null @@ -1,3 +0,0 @@ -<profile version="1.0"> - <option name="myName" value="Default" /> -</profile> \ No newline at end of file diff --git a/pending_01.txt b/pending_01.txt new file mode 100644 index 0000000000000000000000000000000000000000..482c0e338367d0aeb4ddc43602ac727276f77052 Binary files /dev/null and b/pending_01.txt differ diff --git a/vcs.xml b/vcs.xml deleted file mode 100644 index c62ba4bc270aff02e8dc41918dbc68b900b02ce8..0000000000000000000000000000000000000000 --- a/vcs.xml +++ /dev/null @@ -1,21 +0,0 @@ -<application> - <component name="GitRememberedInputs"> - <option name="visitedUrls"> - <list> - <UrlAndUserName> - <option name="url" value="https://dev.itk.ppke.hu/prajczer.peter/Cryptography.git" /> - <option name="userName" value="" /> - </UrlAndUserName> - <UrlAndUserName> - <option name="url" value="http://dev.itk.ppke.hu" /> - <option name="userName" value="prajczer.peter@hallgato.ppke.hu" /> - </UrlAndUserName> - <UrlAndUserName> - <option name="url" value="https://dev.itk.ppke.hu/prajczer.peter/MachnieLearning" /> - <option name="userName" value="" /> - </UrlAndUserName> - </list> - </option> - <option name="cloneParentDir" value="$USER_HOME$/repo" /> - </component> -</application> \ No newline at end of file