У меня есть пара ключей:
Данные зашифрованы вне цепочки:
и он сохраняется в следующем смарт-контракте:
contract Foo {
string data;
}
Могу ли я расшифровать сохраненные данные в сети, предоставив соответствующий закрытый ключ?
function decryptData(string privKey){
...
}
Я не думаю, что это возможно в нынешнем порядке.
SK1 должен быть передан в контракт, поэтому раскрывается всем верификаторам, то есть всем. В любом случае, это препятствие. Таким образом, если контракт может его расшифровать, то каждый может его расшифровать.
Насколько я понимаю, это возможно с реализацией ZKSnarks.
Это может помочь: могут ли смарт-контракты вычислять зашифрованные данные?
Надеюсь, поможет.
Да, можно , по крайней мере в принципе.
Эфириум является полным по Тьюрингу, поэтому вы можете делать любые расчеты, которые вам нравятся. Однако я не знаю каких-либо реальных реализаций, которые делают это в цепочке, и в зависимости от деталей ваших алгоритмов шифрования может быть нецелесообразно делать это в пределах лимита газа. Предстоящее обновление системы Metropolis может помочь, так как оно должно включать функциональность biginteger, которая упростит и удешевит работу с криптовалютой в сети.
Однако, хорошая ли это идея, это другой вопрос, в зависимости от того, чего вы пытаетесь достичь. Закрытый ключ и расшифрованные данные будут видны любому, кто имеет доступ к блокчейну, и в большинстве случаев это то, что вы хотите делать вне сети в любом случае.
Если вы пытаетесь расшифровать данные в цепочке, я рекомендую использовать функцию хэширования ваших данных, добавленную к случайному адресу Эфириума для энтропии. Вот как:
data
переменной в цепочке. Во всех смыслах и целях эти данные зашифрованы, поскольку никто, кроме вас, не знает хеш-ввода, который сгенерировал этот хэш-выход.web3.utils.soliditySha3([realData, randomAddress])
вне сети внутри Web3js. Вы держите оба этих входа в секрете от блокчейна.decrypt
этот хеш, разместите realData
и randomAddress
в смарт-контракте. Хэшируйте их в цепочке, используя функцию Solidity keccak256
. keccak256(abi.encodePacked(uint256 realData, address randomAddress))
.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 не предоставляет функций шифрования/дешифрования, это функции общего назначения очень высокого уровня. Но вы можете попробовать расшифровать за пределами смарт-контракта, используя уже не закрытый ключ, найденный в транзакции.
См. также Каковы эффективные методы шифрования/дешифрования данных, хранящихся в смарт-контракте?
Эдмунд Эдгар
Роб Хитченс
Джузеппе Бертоне
Ник Каррауэй