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

Я пишу код в nodejs/browser. Я успешно создал ethereum-адреса с помощью библиотеки secp256k1 . Я также мог подписывать и проверять сообщения. Теперь я хочу зашифровать/расшифровать сообщение с помощью открытого и закрытого ключа сгенерированных адресов. Кто-нибудь делал это раньше? Могу ли я использовать CryptoJS для достижения своей цели?

Ответы (2)

спасибо @Edmunx Эдгар, я пытался использовать ECIES, но его не удалось установить из-за подзависимости. Теперь я использовал bitcore-lib вместе с bitcore-ecies . Это работает, как и ожидалось.

РЕДАКТИРОВАТЬ: я создал npm-модуль, который делает именно эти вещи, а также имеет некоторые оптимизации производительности и учебные пособия : github:eth-crypto .

Вот мой код для тех, у кого такой же вопрос:

// run 'npm install eth-crypto --save'

const EthCrypto = require('eth-crypto');

// create identitiy with key-pairs and address
const alice = EthCrypto.createIdentity();

const secretMessage = 'My name is Satoshi Buterin';
const encrypted = await EthCrypto.encryptWithPublicKey(
    alice.publicKey, // encrypt with alice's publicKey
    secretMessage
);

const decrypted = await EthCrypto.decryptWithPrivateKey(
    alice.privateKey,
    encrypted
);

if(decrypted === secretMessage) console.log('success');

Запуск через CodeSandbox

Я читал требования к парам ключей биткойн и парам ключей Ethereum. Их размеры различаются, в частности, открытый ключ для протокола биткойн составляет 65 байт (или 33 сжатых байта), тогда как открытый ключ в эфириуме составляет 64 байта. Приведенный выше код не работает для пары ключей Ethereum. Однако вы можете использовать Ethereum privKey для создания нового pubKey из приведенной выше библиотеки, например, var pubKey = new bitcore.PublicKey.fromPrivateKey(privKey);теперь вы можете шифровать и расшифровывать сообщения. Любые предложения о том, как я могу использовать эту библиотеку без обходного пути? Спасибо!
@Malone, нет, извините, в настоящее время я не знаю решения без обходного пути. Также стоит упомянуть, что у bitcore-ecies есть проблемы с производительностью.
@pubkey, изучив это немного глубже, я решил сохранить вышеуказанный метод шифрования. Я использую следующий [ github.com/flyswatter/eth-sig-util](код) , чтобы безопасно получить pubKey Ethereum (довольно полезно для получения ключевой информации посредством подписи Tx). Я создаю прототип, и это шифрование будет происходить не очень часто, поэтому я не слишком беспокоюсь bitcore-eciesо проблемах с производительностью прямо сейчас. Спасибо еще раз.
Привет @Malone, не могли бы вы помочь мне с методом шифрования, который вы использовали? В приведенном выше общем коде он сгенерировал закрытый и открытый ключи в форме bitcore-lib, которые, как вы правильно упомянули, не работают с адресом Ethereum. Так что не могли бы вы поделиться со мной фрагментом кода, как вы достигли шифрование. Я генерирую ключ, используя блог kobl.one/blog/create-full-ethereum-keypair-and-address . и когда я использую пару ключей, сгенерированную через этот блог, это дает мне ошибку. Пожалуйста, напишите ответ на это, если это возможно
Мне нравится имя, которое вы выбрали! Ха-ха
Есть ли способ сделать расшифровку с помощью провайдера web3? У меня нет прямого доступа к закрытому ключу, но я могу подписывать сообщения с помощью провайдера web3, такого как Metamask.
Это не работает для обычных общедоступных адресов Эфириума, например: 0x9a53113da6c670ab04bc80efab364615e54cf1eb. Все открытые ключи в примерах намного длиннее, например, e0d262b939cd0267cfbe3f004e2863d41d1f631ce33701a8920ba73925189f5d15be92cea3c58987aa47ca70216182ba6bd89026fc15edfe2092a140f3. Может кто-нибудь объяснить, как это сделать с обычными короткими адресами eth?
@PASH адрес eth представляет собой хэш открытого ключа. Из-за того, как работает хеширование, информация теряется. Поэтому никогда нельзя использовать адрес для шифрования. Вы должны получить открытый ключ, принадлежащий адресу. Вы можете использовать модуль eth-crypto, чтобы убедиться, что ключ действительно принадлежит этому адресу, снова запустив хеш-функцию.
@pubkey Можно получить открытый ключ адреса, если он отправил транзакцию, см., например, ethereum.stackexchange.com/a/13892/56242 . Теперь также можно расшифровать сообщение с помощью метамаски с помощью eth_decrypt( docs .metamask.io/guide/rpc-api.html#other-rpc-methods )

Предполагая, что у вас есть открытый ключ человека, которому вы хотите отправить сообщение (если он уже подписал транзакцию, вы можете восстановить ее по подписи), должна быть возможность зашифровать и расшифровать с помощью ECIES. По-видимому, для этого есть библиотека JavaScript, я предполагаю, что вы можете использовать ее в браузере: https://bitcointalk.org/index.php?topic=627927.0 .

В любом случае я понятия не имею, достаточно ли хороши эти библиотеки для безопасного использования.

Другой подход заключается в создании отдельной пары ключей, предназначенной для шифрования, а затем использовании ключа Ethereum для подписи открытого ключа и отправки его другой стороне.