【发布时间】:2021-08-09 19:07:55
【问题描述】:
我正在尝试创建一个使用 AES 密钥解密消息的可靠合约。要解密的数据在合约中保存为变量(该数据已经加密)。用户应该能够将 AES 密钥传递给解密函数,该函数应该解密并返回消息。
我不介意将密钥暴露在网络上。有什么办法可以实现吗?
【问题讨论】:
标签: encryption aes ethereum solidity
我正在尝试创建一个使用 AES 密钥解密消息的可靠合约。要解密的数据在合约中保存为变量(该数据已经加密)。用户应该能够将 AES 密钥传递给解密函数,该函数应该解密并返回消息。
我不介意将密钥暴露在网络上。有什么办法可以实现吗?
【问题讨论】:
标签: encryption aes ethereum solidity
Solidity 当前 (v0.8) 不支持任何 AES 算法。
如果您的目标是向提供正确密钥的用户执行操作(例如转移资金),您可以让他们计算某个秘密 (例如密钥)链下,然后提交原始密钥进行验证(针对存储在合约中的哈希)。
pragma solidity ^0.8;
contract MyContract {
// keccak256 hash of the string "foo"
bytes32 hash = 0x41b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d;
function guessThePassword(string memory _password) external view returns (bool) {
return keccak256(abi.encodePacked(_password)) == hash;
}
}
请注意,这种方法(以及您在问题中的原始方法)容易受到抢先交易的影响。防止抢先交易的方法之一是使用双重哈希。您可以在this contract 中看到一个代码示例,用于“首先提交正确的密码可以提款”的竞赛类型。
【讨论】: