Solidity合约中的AES解密

AES Decryption in Solidity Contract

我正在尝试创建一个使用 AES 密钥解密消息的 solidity 合约。要解密的数据作为变量保存在合约中(此数据已加密)。用户应该能够将 AES 密钥传递给解密函数,该函数应该解密并 return 消息。

我不介意密钥暴露在网络上。有什么办法可以实现吗?

Solidity 目前 (v0.8) 不支持任何 AES 算法。


如果您的目标是向提供正确密钥的用户执行某项操作(例如转账),您可以让他们计算 keccak256(单向)哈希 链下的一些秘密(例如密钥),然后提交原始密钥进行验证(针对存储在合约中的哈希值)。

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中看到一个代码示例,该代码示例用于比赛类型“首先提交正确的密码可以提取资金”。