Cómo cifrar una cadena con una clave privada de contrato inteligente y descifrarla sin conexión

Digamos que quiero hacer un contrato inteligente que pueda guardar mensajes secretos (cadenas). Los mensajes deben almacenarse solo en forma encriptada para que nadie pueda leerlos, pero deben ser descifrados por un par de usuarios.

Puedo escribir solidez básica, pero necesito ayuda sobre cómo hacer este diseño de manera inteligente.

Sé que es posible cifrar/descifrar cadenas sin conexión y solo enviar los datos cifrados a la cadena de bloques. Pero en el caso de que haya varios usuarios que necesiten poder descifrar las mismas cadenas, ¿cuál es la mejor manera de hacerlo?

¿Sería esto posible con la creación de un contrato de billetera multi-sig compuesto por unos pocos usuarios? ¿Todos necesitarán tener la clave privada en sus computadoras para poder usarla? ¿No es eso peligroso?

Cualquier consejo muy apreciado.

Respuestas (1)

Lo sentimos, no se puede hacer de forma segura en la cadena de bloques Ethereum con solidez estándar, no en ese modo. Si debe cifrar usando solidez en un contrato inteligente, todas las variables involucradas en la elaboración se almacenan en la cadena de bloques. Se puede demostrar formalmente.

Lo que puede hacer es almacenar cualquier valor ya cifrado en la cadena de bloques, que pueda leer cualquier persona que conozca la clave de cifrado.

Esto (el descifrado) debe realizarse fuera de la cadena (es decir, en un servidor separado y/o en JavaScript en la interfaz de usuario web) si más de un usuario debe acceder a los datos y deben permanecer en secreto, porque si los descifra en EVM usando algunos

decrypt (address encryptedData, uint256 key) returns (byte32 decryptedData)

una copia de la clave estará disponible en la cadena de bloques para siempre, legible por todos (puede leer la transacción en texto claro en etherscan, por ejemplo)

Puede tener algo útil con los algoritmos zk-SNARK, consulte https://link.medium.com/Gj2AvUVMeR , pero no es trivial y, hasta ahora, no se conocen implementaciones adecuadas en Solidity y EVM.