基于DGHV的同态加密¶
基本概念、学习笔记、参考内容:
概念、个人笔记:
参考:
- 论文:《一种基于智能合约的全同态加密方法》
- [1] M. Dijk, C. Gentry, S. Halevi, and V.Vaikuntanathan. Fully homomorphic encryption over the integers[J]. Applications of Cryptographic Techniques: Springer, Berlin, 2010, 24-43.
- http://blog.sciencenet.cn/blog-411071-617182.html
同态加密等计算量大的算法不适合在合约中计算,合约仅作为测试
基本设计¶
1. 随机数¶
我们所说的随机函数都是伪随机函数即PRF
随机函数的一般构成是:随机种子 + 随机数生成算法
目前有很多优秀的伪随机算法已经实现,但是在区块链智能合约上的最大困难是区块链的封闭性
可以将区块链看作一个封闭式的信息世界,所以不像一般网络中有丰富的熵增源.
Solidity通常采用keccak256哈希函数 作为随机数的生成器,该函数有一定的随机数性质,但是随机数生成的过程容易被攻击。
传统的随机数生成过程需要本结点的 Nonce值作为随机数种子,恶意节点会大量计算Nonce的值,直到随机事件的结果对自己有利,所以项目采用区块时间戳作为随机种子。
使用线性求余法生成随机数,再采用keccak256 Hash函数将区块时间戳与随机数合并取最终的随机数
生成公式如下:
HUTVJl
2. 整数上的全同态加密¶
iPUQRe
功能测试¶
合约实现了输入为单Bit(即m ∈ {0, 1})的加法同态加密(使用对称秘钥)
step_1 选择参数¶
编译、运行syn_DGHV.go
对于参数η,加法同态始终满足,但是乘法同态满足有要求(因为算法噪音):
- 经测试η>=9时,乘法同态满足(小于9时不稳定,可见评估结果输出)
- 智能合约中3<=η<=5, 因为η过大会导致参数q过大无法部署合约(solidity最大为int256,没有大数操作)
go run syn_DGHV.go 5 # 参数1:η (建议>=9, 合约中<=5)
运行结果中包含:
- 生成的秘钥
p
- 参数
q
输出示例(输出包含了多组测试,选择一组参数即可):
==============================================
p = 31
q = 42535295865117307932921825928971026418
m0 = 0, m1 = 1
解密结果:n0 = 0, n1 = 1
加法测试:0 + 1 , true
加法测试:0 + 0 , true
加法测试:1 + 1 , true
加法测试:1 + 0 , true
==============================================
乘法测试:0 * 1 , true
乘法测试:0 * 0 , true
乘法测试:1 * 1 , true
乘法测试:1 * 0 , true
==============================================
step_2 部署合约,输入参数¶
以控制台为例¶
[group:1]> deploy DGHV_Homomorphic_Encryption
deploy contract failed for cannot encode in encodeMethodFromObject with appropriate interface ABI, cause:Arguments mismatch: arguments size, expected: 3, actual: 0
[group:1]> deploy DGHV_Homomorphic_Encryption 5 42535295865117307932921825928971026418 31
transaction hash: 0xbde9ee1278af7cf59f49fc3dda084852a3d0cf922d40c337b0b72daa063d2afc
contract address: 0x6c0ca924fb69c4bbef81d710c1b2769dc568035b
currentAccount: 0x22fec9d7e121960e7972402789868962238d8037
[group:1]> call DGHV_Homomorphic_Encryption 0x6c0ca924fb69c4bbef81d710c1b2769dc568035b encrypto 1
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (UINT)
Return values:(1318594171818636545920576603798101818965)
---------------------------------------------------------------------------------------------
[group:1]> call DGHV_Homomorphic_Encryption 0x6c0ca924fb69c4bbef81d710c1b2769dc568035b encrypto 0
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (UINT)
Return values:(1318594171818636545920576603798101818964)
---------------------------------------------------------------------------------------------
[group:1]> call DGHV_Homomorphic_Encryption 0x6c0ca924fb69c4bbef81d710c1b2769dc568035b decrypto 131859417181863654592057
6603798101818965
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (UINT)
Return values:(1)
---------------------------------------------------------------------------------------------
[group:1]> call DGHV_Homomorphic_Encryption 0x6c0ca924fb69c4bbef81d710c1b2769dc568035b decrypto 131859417181863654592057
6603798101818964
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (UINT)
Return values:(0)
---------------------------------------------------------------------------------------------
[group:1]> call DGHV_Homomorphic_Encryption 0x6c0ca924fb69c4bbef81d710c1b2769dc568035b HE_Add 13185941718186365459205766
03798101818965 1318594171818636545920576603798101818964
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (UINT)
Return values:(1)
---------------------------------------------------------------------------------------------
拓展与改进¶
在合约中实现字符串大数的基本计算就可以实现合约上的同态乘法(或许有更好的办法)
虽然输入只支持1bit,但是可以通过组合电路实现高阶的计算:
- 同态加法 等价于 逻辑异或
- 同态乘法 等价于 逻辑与
- 逻辑与与逻辑异或具有完备性,可以实现组合电路任意高阶计算
(图片来自论文)
设计电路时注意使用Bootstappable算法减少噪声,不然会时效