Как можно «зашифровать» сообщение, используя биткойн *открытый ключ* и использовать его закрытый ключ для его расшифровки?

У меня есть следующая текстовая строка:

Это тестовое сообщение.

  • Используя мой открытый биткойн-ключ (биткойн-адрес?), как я могу зашифровать это сообщение?

  • Как мне расшифровать сообщение с помощью закрытого ключа биткойн?

Вы хотите зашифровать с помощью открытого ключа или с помощью пароля? Эти два требуют очень разных технологий.
в основном берете чей-либо биткойн-адрес и шифруете сообщение, затем отправляете этому человеку зашифрованное сообщение, где он может расшифровать его с помощью своего закрытого ключа биткойн. Или это вообще не работает?
Но вы также упоминаете AES и вам нужен пароль для расшифровки?
обновленный вопрос. удалена ссылка на aes. сбивало с толку.
Биткойн - адрес получен из открытого ключа, но его недостаточно для шифрования.
Смотрели на это. Моя мысль заключалась в том, чтобы иметь суперпортативный ключ, такой как ключ BTC. Что-то, что можно хранить с помощью мнемоники, а не огромных файлов.

Ответы (3)

Да, это возможно.

Однако я хочу заранее заявить, что это не рекомендуется по нескольким причинам:

  • Биткойн-ключи предназначены для одноразового использования из соображений конфиденциальности, и использование их для шифрования без необходимости поощряет обращение с ними как с долгоживущей личностью.
  • Могут быть уродливые и опасные взаимодействия, когда ключи используются для нескольких протоколов независимо.
  • Гораздо лучше использовать системы, которые на самом деле были разработаны для шифрования, чем пытаться использовать криптографию Биткойн.
  • Внедрение собственной криптографии очень опасно (в общем, если вы не знаете, что делаете, и не получаете много отзывов от экспертов).

Существует схема под названием ECIES , которая позволяет использовать ключи эллиптической кривой для создания системы шифрования.

Короче говоря, это работает:

Отправитель:

  • генерирует эфемерный закрытый ключ k с помощью сильного криптографического генератора случайных чисел со связанным открытым ключом k = kG (здесь умножение относится к умножению на эллиптической кривой ).
  • вычисляет общий секрет ECDH s = H(kP) , где P — открытый ключ получателя.
  • вычисляет два симметричных ключа x 1 и x 2 с помощью KDF , заполненного s : (x 1 , x 2 ) = KDF(s) .
  • шифрует сообщение m , используя AES, с x 1 в качестве ключа, чтобы получить c = AECEnc x 1 (m) .
  • вычислить MAC для K и c с x 2 в качестве ключа: h = MAC x 2 (K || c) .
  • отправляет (K, c, h) получателю.

Получатель:

  • вычисляет общий секрет ECDH, используя s = H(pK) , где p — его закрытый ключ.
  • вычисляет те же два симметричных ключа x 1 и x 2 : (x 1 , x 2 ) = KDF(s) .
  • вычисляет тот же MAC h' = MAC x 2 (K || c)
  • проверяет, что h' = h , и терпит неудачу, если нет.
  • расшифровывает сообщение, используя s , m' = AESDec x 1 (c) .
Если у вас нет MAC, то то, что вы внедрили, не является ECIES и часто будет уязвимо для атак оракула дешифрования. Например, я получаю сообщение, которое я хочу расшифровать, а затем отправляю вам серию сообщений, повторно используя эфемерный ключ и исследуя, как вы реагируете на различные ненужные зашифрованные тексты.
@ G.Maxwell Хороший вопрос, исправлено.
пара опечаток: with associated public key k = kG.. здесь должна быть заглавная K = kG; и AECEncдолжно бытьAESEnc

Если вы хотите зашифровать сообщения, вам следует использовать подходящий инструмент шифрования сообщений/файлов, такой как PGP/GPG. Самодельная криптография с использованием биткойнов имеет плохие свойства безопасности.

Хотя вы, наверное, правы. Это не похоже на ответ на вопрос. Я бы подумал, что вы говорите «это невозможно сделать», но опять же кажется, что вы говорите, что это можно сделать, но не отвечаете «как», что является вопросом.
Ответ: «Вы, вероятно, не должны». Я думаю, что это гораздо более ценный ответ, чем предоставление учебника, который в конечном итоге оставляет спрашивающего менее информированным и потенциально полностью небезопасным.
Я не согласен, что «вы, вероятно, не должны» - это вообще ответ. Это может быть частью ответа, как заявление об отказе от ответственности, как в ответе Питера. Одиночество, однако, больше похоже на отрицание ответа. Хотя вопросы иногда касаются вещей, которые, кажется, никому не нужны, могут быть редкие законные варианты использования. Даже если потребность OP не является законной, будущий читатель может.

Обязательно следуйте предупреждениям, данным ранее в других ответах, но для записи это было реализовано в проекте под названием Bitmessage . Основная реализация находится на Python по адресу https://github.com/Bitmessage/PyBitmessage . Существует также модуль npm для node.js, который реализовал это для сервера и браузера, используя библиотеки openssl c под капотом eccrypto:

Установить зависимости

$ 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());
  });
});