Descifrado en un contrato inteligente

Tengo un par de claves:

Los datos se cifran fuera de la cadena:

y se guarda en el siguiente contrato inteligente:

contract Foo {
    string data;
}

¿Puedo descifrar los datos almacenados en la cadena, suponiendo que proporcione una clave privada correspondiente?

function decryptData(string privKey){
    ...
}

Respuestas (4)

No creo que esto sea posible en el arreglo actual.

SK1 tendría que ser transmitido al contrato, por lo tanto, revelado a todos los verificadores, que es todo el mundo. En cualquier caso, ese es el obstáculo. En resumen, si el contrato puede decodificarlo, todos pueden decodificarlo.

Este es el tipo de cosas que podrían ser posibles con una implementación de ZKSnarks, según tengo entendido.

Esto podría ser de ayuda: ¿Pueden los contratos inteligentes calcular datos encriptados?

Espero eso ayude.

Leí la pregunta como si puede hacer el descifrado, no si puede hacerlo y mantener la clave privada y el resultado en secreto. Hay varias razones por las que podría querer hacer esto.
@EdmundEdgar Puede que tengas razón.
Responda abajo. En cualquier caso, ¿qué es exactamente lo que estás tratando de lograr? ¿Demostrar que alguien tiene la clave correcta en privado?
La pregunta se refiere al descifrado, no al cifrado.

Sí, se puede , al menos en principio.

Ethereum es Turing-completo, por lo que puede hacer los cálculos que desee. Sin embargo, no conozco ninguna implementación real que haga esto en la cadena y, dependiendo de los detalles de sus algoritmos de cifrado, puede que no sea práctico hacerlo dentro del límite de gas. La próxima actualización del sistema Metropolis puede ayudar, ya que debería incluir la funcionalidad biginteger que hará que sea más fácil y económico hacer cosas criptográficas en la cadena.

Sin embargo, si esta es una buena idea es otra cuestión, dependiendo de lo que estés tratando de lograr. La clave privada y los datos descifrados serán visibles para cualquier persona que pueda acceder a la cadena de bloques y, en la mayoría de los casos, este es el tipo de cosas que desea hacer fuera de la cadena en cualquier caso.

¿Qué sucede si la función decryptData es una llamada y no publica ni transmite nada en la cadena de bloques? En este caso, la clave privada y los datos cifrados no serán visibles para nadie. ¿O me pierdo algo?
Bueno, podría escribir el código EVM para realizar el descifrado, almacenar el código en la cadena de bloques y ejecutarlo solo localmente en su propio nodo. Aunque no estoy seguro de si contaría como "en la cadena de bloques"...
Si utilizo el modificador Propietario como se describe en la documentación de Solidity, ¿se cifrará en el interior de tal manera que, aunque los datos sean públicos, todo sea un galimatías?

Si está tratando de descifrar datos en cadena, le recomiendo usar una función de hashing en sus datos adjuntos a una dirección aleatoria de ethereum para la entropía. Así es cómo:

  1. Publique datos hash dentro de su datavariable dada en la cadena. Para todos los efectos, estos datos están encriptados, ya que nadie más que usted conoce las entradas hash que generaron esta salida hash.
  2. Estos datos son un hash hecho por: web3.utils.soliditySha3([realData, randomAddress])fuera de la cadena dentro de Web3js. Mantiene estas dos entradas en secreto de la cadena de bloques.
  3. Cuando desee decrypteste hash, publique el realDatay randomAddressen un contrato inteligente. Hazlos hash en cadena usando keccak256la función de solidez. keccak256(abi.encodePacked(uint256 realData, address randomAddress)).
  4. Si el hash en cadena coincide con la datavariable, entonces estos datos han sido efectivamente decrypted.

Originalmente escribí mi respuesta usando solo firmas, pero estaba mal. No puede usar una función de firma para esto (también cuesta más gasolina de todos modos). Para más información: https://crypto.stackexchange.com/questions/43894/asymmetry- between -public-key-and-private-key-digital-signatures-use-the-private

Si desea asegurarse de que el hash provino de un usuario autorizado, use un mappingobjeto para almacenar los hash en función de una msg.sendervariable. msg.senderes efectivamente una firma tal como es.

No, no puedes. Ethereum EVM no proporciona funciones de cifrado/descifrado, son funciones de propósito general de muy alto nivel. Pero puede intentar descifrar fuera del contrato inteligente, utilizando la clave que ya no es privada que se encuentra en la transacción.

Consulte también ¿Cuáles son las técnicas efectivas para cifrar/descifrar datos almacenados en un contrato inteligente?