Расшифровка в смарт-контракте

У меня есть пара ключей:

Данные зашифрованы вне цепочки:

и он сохраняется в следующем смарт-контракте:

contract Foo {
    string data;
}

Могу ли я расшифровать сохраненные данные в сети, предоставив соответствующий закрытый ключ?

function decryptData(string privKey){
    ...
}

Ответы (4)

Я не думаю, что это возможно в нынешнем порядке.

SK1 должен быть передан в контракт, поэтому раскрывается всем верификаторам, то есть всем. В любом случае, это препятствие. Таким образом, если контракт может его расшифровать, то каждый может его расшифровать.

Насколько я понимаю, это возможно с реализацией ZKSnarks.

Это может помочь: могут ли смарт-контракты вычислять зашифрованные данные?

Надеюсь, поможет.

Я прочитал вопрос о том, можете ли вы выполнить расшифровку, а не можете ли вы сделать это и сохранить закрытый ключ и результат в секрете. Есть разные причины, по которым вы можете захотеть это сделать.
@EdmundEdgar Возможно, ты прав.
Ответ ниже. В любом случае, чего именно вы пытаетесь достичь? Доказать, что кто-то держит правильный ключ закрытым?
Вопрос касается расшифровки, а не шифрования.

Да, можно , по крайней мере в принципе.

Эфириум является полным по Тьюрингу, поэтому вы можете делать любые расчеты, которые вам нравятся. Однако я не знаю каких-либо реальных реализаций, которые делают это в цепочке, и в зависимости от деталей ваших алгоритмов шифрования может быть нецелесообразно делать это в пределах лимита газа. Предстоящее обновление системы Metropolis может помочь, так как оно должно включать функциональность biginteger, которая упростит и удешевит работу с криптовалютой в сети.

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

Что, если функция decryptData является вызовом и ничего не публикует и не транслирует в блокчейне? В этом случае закрытый ключ и зашифрованные данные никому не будут видны. Или я что-то упускаю?
Что ж, вы можете написать код EVM для расшифровки, сохранить код в блокчейне и запускать его только локально на своем собственном узле. Я не уверен, будет ли это считаться «на блокчейне», хотя…
Если я использую модификатор владельца, как описано в документации Solidity, он будет зашифрован внутри, так что даже если данные общедоступны, все они будут тарабарщиной?

Если вы пытаетесь расшифровать данные в цепочке, я рекомендую использовать функцию хэширования ваших данных, добавленную к случайному адресу Эфириума для энтропии. Вот как:

  1. Разместите хешированные данные внутри вашей dataпеременной в цепочке. Во всех смыслах и целях эти данные зашифрованы, поскольку никто, кроме вас, не знает хеш-ввода, который сгенерировал этот хэш-выход.
  2. Эти данные представляют собой хэш, созданный web3.utils.soliditySha3([realData, randomAddress])вне сети внутри Web3js. Вы держите оба этих входа в секрете от блокчейна.
  3. Когда вы хотите получить decryptэтот хеш, разместите realDataи randomAddressв смарт-контракте. Хэшируйте их в цепочке, используя функцию Solidity keccak256. keccak256(abi.encodePacked(uint256 realData, address randomAddress)).
  4. Если хеш в цепочке соответствует переменной data, то эти данные фактически были decrypted.

Первоначально я написал свой ответ, используя только подписи, но это было неправильно. Вы не можете использовать для этого функцию подписи (в любом случае это стоит больше газа). Для получения дополнительной информации: https://crypto.stackexchange.com/questions/43894/asymmetry-between-public-key-and-private-key-digital-signatures-use-the-private

Если вы хотите убедиться, что хэш поступил от авторизованного пользователя, используйте объект mappingдля хранения хэшей на основе msg.senderпеременной. msg.senderфактически является подписью как таковой.

Нет, ты не можешь. Ethereum EVM не предоставляет функций шифрования/дешифрования, это функции общего назначения очень высокого уровня. Но вы можете попробовать расшифровать за пределами смарт-контракта, используя уже не закрытый ключ, найденный в транзакции.

См. также Каковы эффективные методы шифрования/дешифрования данных, хранящихся в смарт-контракте?