Threast Geschrieben 6. September 2022 Teilen Geschrieben 6. September 2022 Hallo zusammen, ich arbeite gegenwärtig ich Buch zum Thema Blockchain-Entwicklung durch und bin mittlerweile beim letzten Kapitel angekommen allerdings ist mir hier das ein oder andere nicht ganz verständlich, vielleicht kann mir hier ja nochmal wer weiterhelfen. Im letzten Kapitel geht es u.A darum Transaktionen zu signieren und anschießend zu verifizieren aber ich tu mich noch etwas schwer das ganze zu verstehen. Ich poste euch unten die entsprechenden Seiten im Buch damit ihr mir besser folgen könnt. Und zwar ausgangssituation ist folgende: Ich habe einen Block Explorer erstellt über den es möglich ist die Blockchain zu durchsuchen und auch Transaktionen zu versenden. Um das versenden zu ermöglichen muss der User unter Anderem seinen privaten und öffentlichen Schlüssel eingeben. Diese werden dann im Frontend mittels JavaScript benutzt um die Transaktion zu signieren. Im Backend soll das ganze dann mittels der Methoden „verify()“ verifiziert werden. Im Buch heißt es das Frontend und das Backend müssen die exakt gleiche Repräsentation einer Transaktionen verwenden. Ist damit die JSON Repräsentation gemeint oder der Hash oder beides? Ebenfalls heißt es dann bei der Methode verify dass die Signatur selbst nur aus den Punkten R und S besteht. Diese „sind im ASN1 Format codiert und müssen aus dem Hex-String der Signatur ermittelt werden. Anschließend kann mit der Library von Bouncy Castle die Transaktion verifiziert werden“. Kann mir bitte wer in eigenen Worten erklären wie ich mit diesen 2 Punkten (und dem Hash der Transaktionen und dem Public Key) die Transaktion verifizieren soll? Ich habe den gestrigen Tag bereits damit verbracht mich mit elliptischen Kurven auseinanderzusetzen, einige Uni-Vorlesungen dazu angesehen usw. Also mit dem Grundlegenden Prinzip davon bin ich vertraut, auch mit Gruppenoperationen usw. Aber wirklich verstehen tu ich diesen Schritt im Buch trotzdem noch nicht, villeicht kann mit ja wer helfen 😊 ``` //Methoden public static boolean verify(byte[] hash, byte[] signature, byte[] publicKey) { boolean result; try(ASN1InputStream asn1 = new ASN1InputStream(signature)) { ECDSASigner signer = new ECDSASigner(); signer.init(false, new ECPublicKeyParameters(CURVE.getCurve().decodePoint(publicKey), DOMAIN)); DLSequence seq = (DLSequence) asn1.readObject(); BigInteger r = ((ASN1Integer) seq.getObjectAt(0)).getPositiveValue(); BigInteger s = ((ASN1Integer) seq.getObjectAt(1)).getPositiveValue(); result = signer.verifySignature(hash, r, s); } catch (Exception e) { result = false; } return result; } ``` Buchseiten:https://ibb.co/0Xk36rphttps://ibb.co/drML2VQhttps://ibb.co/6vHbcYvhttps://ibb.co/TT5cMKZhttps://ibb.co/hVktpLf Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
skunk Geschrieben 6. September 2022 Teilen Geschrieben 6. September 2022 vor 3 Stunden schrieb Threast: der User unter Anderem seinen privaten und öffentlichen Schlüssel eingeben. Warum fragst du den öffentlichen Schlüssel ab? Als User erwarte ich eigentlich, dass du den öffentlichen Schlüssel aus dem privaten Schlüssel errechnest anstatt mich danach zu fragen. vor 3 Stunden schrieb Threast: Im Backend soll das ganze dann mittels der Methoden „verify()“ verifiziert werden. Im Buch heißt es das Frontend und das Backend müssen die exakt gleiche Repräsentation einer Transaktionen verwenden. Ist damit die JSON Repräsentation gemeint oder der Hash oder beides? Betrachte es mal aus einem anderen Blickwinkel. Sagen wir das ist meine Transaktion und du willst sie manipulieren. Was würdest du alles versuchen? Naheliegend ist sowas wie Zieladresse verändern. Dann stimmt die Signatur nicht mehr. Was muss die Verify Methode machen um eine solche Manipulation zu erkennen? Wenn du noch ein paar andere Manipulationsmöglichkeiten im Kopf durchspielst ergibt sich daraus ein recht gutes Bild was die Verify Methode alles prüfen muss. vor 3 Stunden schrieb Threast: Ebenfalls heißt es dann bei der Methode verify dass die Signatur selbst nur aus den Punkten R und S besteht. Diese „sind im ASN1 Format codiert und müssen aus dem Hex-String der Signatur ermittelt werden. Anschließend kann mit der Library von Bouncy Castle die Transaktion verifiziert werden“. Kann mir bitte wer in eigenen Worten erklären wie ich mit diesen 2 Punkten (und dem Hash der Transaktionen und dem Public Key) die Transaktion verifizieren soll? Die zwei Punkte sind der Public Key der zum Prüfen der Signatur notwendig ist. Wie willst du ohne Public Key sonst die Transaktion überprüfen? Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Threast Geschrieben 6. September 2022 Autor Teilen Geschrieben 6. September 2022 (bearbeitet) @skunk Ja normalerweise schon aber die Autoren des Buches haben das denk ich mal aus Vereinfachungsgründen weggelassen und stattdessen einfach den PubKey auch noch abfragen lassen. Ich dachte die Punkt R und S ergeben sich durch die Verschlüsselung des Senders mit seinem PrivateKey die dann der Empfänger wiederum mit dem PublicKey des Senders verifizieren muss oder nicht? Bearbeitet 6. September 2022 von Threast Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
skunk Geschrieben 6. September 2022 Teilen Geschrieben 6. September 2022 vor 5 Minuten schrieb Threast: Ich dachte die Punkt R und S ergeben sich durch die Verschlüsselung des Senders mit seinem PrivateKey die dann der Empfänger wiederum mit dem PublicKey des Senders verifizieren muss oder nicht? Ja das ist richtig. Woher soll der Empfänger den Public Key wissen wenn nicht aus den zwei Punkten? Ohne Public Key funktioniert die Verifikation nicht mehr. Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Threast Geschrieben 6. September 2022 Autor Teilen Geschrieben 6. September 2022 vor 9 Minuten schrieb skunk: Ja das ist richtig. Woher soll der Empfänger den Public Key wissen wenn nicht aus den zwei Punkten? Ohne Public Key funktioniert die Verifikation nicht mehr. Ahh jetzt kommen wir der Sache schon näher😅 Also zusammengefasst entstehen R und S durch die Signierung mit dem privateKey und aus den beiden Punkten lässt sich wiederum der publicKey des Senders berechnen welcher dann wiederum zur Verifizierung der Transaktion verwendet wird oder? 1 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Threast Geschrieben 7. September 2022 Autor Teilen Geschrieben 7. September 2022 (bearbeitet) @skunkAlso ich hab mir das ganze jetzt nochmal anhand meines Beispiels angesehen und kann die Verifikation jetzt auch ganz gut nachvollziehen. Das einzige was ich noch nicht verstehe ist die Sache mit dem Hash den ich der Methode übergebe: public static boolean verify(byte[] hash, byte[] signature, byte[] publicKey) { boolean result; try(ASN1InputStream asn1 = new ASN1InputStream(signature)) { ECDSASigner signer = new ECDSASigner(); signer.init(false, new ECPublicKeyParameters(CURVE.getCurve().decodePoint(publicKey), DOMAIN)); DLSequence seq = (DLSequence) asn1.readObject(); BigInteger r = ((ASN1Integer) seq.getObjectAt(0)).getPositiveValue(); BigInteger s = ((ASN1Integer) seq.getObjectAt(1)).getPositiveValue(); result = signer.verifySignature(hash, r, s); } catch (Exception e) { result = false; } return result; } Denn übergeben tu ich der obigen Methode folgendes: public static boolean verifySignature(Transaction transaction) { boolean result; try { logger.debug(transaction.asJSONString()); result = SignatureHelper.verify(transaction.asJSONString().getBytes("UTF-8"), transaction.getSignature(), transaction.getSender()); logger.debug("signature verification result: " + result); } catch (Exception e) { result = false; } return result; } Nämlich die JSON Repräsentation meiner Transaktion... Aber die JSON Repräsentation ist doch nicht der Hash??? Das wäre noch die "asJSONString" -Methode: public String asJSONString( ) { DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); df.setMaximumFractionDigits(340); return "{" + "\"sender\":\"" + SHA3Helper.digestToHex( sender ) + '\"' + ",\"receiver\":\"" + SHA3Helper.digestToHex( receiver ) + '\"' + ",\"amount\":\"" + amount + "\"" + // ",\"nonce\":" + nonce + ",\"transactionFeeBasePrice\":\"" + df.format( transactionFeeBasePrice ) + "\"" + ",\"transactionFeeLimit\":\"" + transactionFeeLimit + "\"" + '}'; } Ich glaub als nächstes muss ich mich mal intensiv mit den ganzen Codierungen und Konvertierungen auseinandersetzen weil da haperts noch ziemlich😅 Bearbeitet 7. September 2022 von Threast Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mahatma Geschrieben 7. September 2022 Teilen Geschrieben 7. September 2022 (bearbeitet) vor 14 Stunden schrieb Threast: Ich glaub als nächstes muss ich mich mal intensiv mit den ganzen Codierungen und Konvertierungen auseinandersetzen weil da haperts noch ziemlich😅 https://learnmeabitcoin.com/technical/ecdsa wie ich finde sehr verständlich und ziemlich bis zum ende aufgedröselt, insbesondere die ganzen formatierungs und codierungs geschichten... Bearbeitet 7. September 2022 von mahatma Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Threast Geschrieben 8. September 2022 Autor Teilen Geschrieben 8. September 2022 vor 15 Stunden schrieb mahatma: https://learnmeabitcoin.com/technical/ecdsa wie ich finde sehr verständlich und ziemlich bis zum ende aufgedröselt, insbesondere die ganzen formatierungs und codierungs geschichten... Danke für den Link, ich werd mir das mal ansehen👍 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden