Wie würde man eine Nachricht mit einem *öffentlichen Bitcoin-Schlüssel* "verschlüsseln" und seinen privaten Schlüssel verwenden, um sie zu entschlüsseln?

Ich habe folgenden Textstring:

Dies ist eine Testnachricht.

  • Wie kann ich diese Nachricht mit meinem öffentlichen Bitcoin-Schlüssel (Bitcoin-Adresse?) verschlüsseln?

  • Wie würde ich die Nachricht mit einem privaten Bitcoin-Schlüssel entschlüsseln?

Möchten Sie mit einem öffentlichen Schlüssel verschlüsseln oder ein Passwort verwenden? Diese beiden erfordern sehr unterschiedliche Technologien.
Nehmen Sie im Grunde die Bitcoin-Adresse einer Person und verschlüsseln Sie eine Nachricht. Senden Sie dann dieser Person die verschlüsselte Nachricht, wo sie sie mit ihrem privaten Bitcoin-Schlüssel entschlüsseln kann. Oder geht das gar nicht?
Aber Sie erwähnen auch AES und benötigen ein Passwort zum Entschlüsseln?
aktualisierte Frage. AES-Referenz entfernt. war verwirrend.
Die Bitcoin -Adresse wird vom öffentlichen Schlüssel abgeleitet, reicht jedoch nicht zum Verschlüsseln aus.
Habe mir das angeschaut. Mein Gedanke war, einen Schlüssel zu haben, der wie ein BTC-Schlüssel super tragbar ist. Etwas, das im Gegensatz zu riesigen Dateien über eine Mnemonik gespeichert werden kann.

Antworten (3)

Ja, das ist möglich.

Ich möchte jedoch im Voraus sagen, dass dies aus mehreren Gründen nicht ratsam ist:

  • Bitcoin-Schlüssel sind aus Datenschutzgründen für den einmaligen Gebrauch bestimmt, und ihre Nutzung zur Verschlüsselung fördert unnötigerweise die Behandlung als langlebige Identität.
  • Es kann hässliche und gefährliche Interaktionen geben, wenn Schlüssel unabhängig voneinander für mehrere Protokolle verwendet werden.
  • Sie sind viel besser dran, Systeme zu verwenden, die eigentlich für die Verschlüsselung entwickelt wurden, als zu versuchen, die Kryptographie von Bitcoin zu huckepack zu nehmen.
  • Die Implementierung Ihrer eigenen Kryptografie ist sehr gefährlich (im Allgemeinen, es sei denn, Sie wissen, was Sie tun, und erhalten zahlreiche Bewertungen von Experten).

Es gibt ein Schema namens ECIES , mit dem Sie elliptische Kurvenschlüssel nutzen können, um ein Verschlüsselungssystem zu erstellen.

Kurz gesagt, es funktioniert durch:

Der Absender:

  • generiert einen vergänglichen privaten Schlüssel k unter Verwendung eines starken kryptografischen Zufallszahlengenerators mit zugehörigem öffentlichen Schlüssel k = kG (Multiplikation bezieht sich hier auf Elliptic Curve Multiplication ).
  • berechnet ein gemeinsames ECDH - Geheimnis s = H(kP) , wobei P der öffentliche Schlüssel des Empfängers ist.
  • berechnet zwei symmetrische Schlüssel x 1 und x 2 unter Verwendung einer KDF , die von s gesät wird : (x 1 , x 2 ) = KDF(s) .
  • verschlüsselt die Nachricht m mit AES, mit x 1 als Schlüssel, um c = AECEnc x 1 (m) zu erhalten .
  • berechne einen MAC auf K und c mit x 2 als Schlüssel: h = MAC x 2 (K || c) .
  • sendet (K, c, h) an den Empfänger.

Der Empfänger:

  • berechnet das gemeinsame ECDH-Geheimnis unter Verwendung von s = H(pK) , wobei p sein privater Schlüssel ist.
  • berechnet dieselben zwei symmetrischen Schlüssel x 1 und x 2 : (x 1 , x 2 ) = KDF(s) .
  • berechnet denselben MAC h' = MAC x 2 (K || c)
  • überprüft, ob h' = h , und schlägt fehl, wenn dies nicht der Fall ist.
  • entschlüsselt die Nachricht mit s , m' = AESDec x 1 (c) .
Wenn Sie keinen MAC haben, dann ist das, was Sie implementiert haben, kein ECIES und wäre oft anfällig für Entschlüsselungs-Orakelangriffe. Zum Beispiel nehme ich eine Nachricht an Sie, die ich entschlüsseln möchte, und sende Ihnen dann eine Reihe von Nachrichten, wobei ich den kurzlebigen Schlüssel erneut verwende und untersuche, wie Sie auf verschiedene Junk-Chiffretexte reagieren.
@G.Maxwell Guter Punkt, behoben.
ein paar Tippfehler: with associated public key k = kG.. hier sollte es groß geschrieben werden K = kG; und AECEncsein sollteAESEnc

Wenn Sie Nachrichten verschlüsseln möchten, sollten Sie ein geeignetes Nachrichten-/Dateiverschlüsselungstool wie PGP/GPG verwenden. Selbstgebastelte Kryptografie mit Bitcoin-Dingen neigt dazu, schlechte Sicherheitseigenschaften zu haben.

Während Sie wahrscheinlich Recht haben. Das scheint die Frage nicht wirklich zu beantworten. Ich würde denken, Sie sagen "es kann nicht getan werden", aber andererseits scheinen Sie zu sagen, dass es getan werden kann, aber nicht "wie" zu beantworten, was die Frage ist.
Die Antwort ist "Sie sollten wahrscheinlich nicht". Ich denke, dies ist eine viel wertvollere Antwort, als ein Tutorial zu geben, das den Fragesteller letztendlich weniger informiert und möglicherweise völlig unsicher macht.
Ich stimme nicht zu, dass "Sie sollten es wahrscheinlich nicht tun" überhaupt eine Antwort ist. Es könnte Teil einer Antwort sein, als Haftungsausschluss wie in Pieters Antwort. Alleine ist jedoch eher wie das Verweigern einer Antwort. Obwohl Fragen manchmal Dinge stellen, die scheinbar niemand brauchen sollte, könnte es seltene legitime Anwendungsfälle geben. Auch wenn das Bedürfnis des OP nicht legitim ist, könnte es das eines zukünftigen Lesers sein.

Befolgen Sie unbedingt die Warnungen, die zuvor in anderen Antworten gegeben wurden, aber für die Aufzeichnung wurde dies in einem Projekt namens Bitmessage implementiert . Die Hauptimplementierung befindet sich in Python unter https://github.com/Bitmessage/PyBitmessage . Es gibt auch ein npm-Modul für node.js, das dies für den Server und den Browser unter Verwendung von OpenSSL-C-Bibliotheken unter der Haube implementiert: eccrypto:

Abhängigkeiten installieren

$ npm install -g eccrypto

index.js

var crypto = require("crypto");
var eccrypto = require("eccrypto");

var privateKeyA = crypto.randomBytes(32);
var publicKeyA = eccrypto.getPublic(privateKeyA);
var privateKeyB = crypto.randomBytes(32);
var publicKeyB = eccrypto.getPublic(privateKeyB);

// Encrypting the message for B.
eccrypto.encrypt(publicKeyB, Buffer("msg to b")).then(function(encrypted) {
  // B decrypting the message.
  eccrypto.decrypt(privateKeyB, encrypted).then(function(plaintext) {
    console.log("Message to part B:", plaintext.toString());
  });
});

// Encrypting the message for A.
eccrypto.encrypt(publicKeyA, Buffer("msg to a")).then(function(encrypted) {
  // A decrypting the message.
  eccrypto.decrypt(privateKeyA, encrypted).then(function(plaintext) {
    console.log("Message to part A:", plaintext.toString());
  });
});