Zum Inhalt springen

Transaktionen signieren -und verifizieren


Empfohlene Beiträge

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/0Xk36rp
https://ibb.co/drML2VQ
https://ibb.co/6vHbcYv
https://ibb.co/TT5cMKZ
https://ibb.co/hVktpLf

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

@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 von Threast
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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?

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

@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 von Threast
Link zu diesem Kommentar
Auf anderen Seiten teilen

 

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 von mahatma
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.