基于Haskell的部分同态加密

flmtquvp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(182)

我正在使用Haskell中一个相当简单的Paillier部分同态加密库。
不幸的是,这个库不处理负数或浮点数。它只对正整数进行操作。因此,

decrypt prvKey pubKey (encrypt pubKey (-10))  =/=  -10

字符串
我处理负数和浮点数的简单方法是将整数乘以我想要的精度(比如10^6),然后将其转换回来,但在内部,一些模运算不适用于同态乘法(取幂)。
这个问题可以归结为找到一个好的编码负数以及浮点数到一个Integer类型(Haskell中的任意精度整数类型)。有没有什么好的编码策略?
另一种策略可以是修改cryptonite包中的模幂函数,以处理负数的模运算(https://hackage.haskell.org/package/cryptonite-0.30/docs/Crypto-Number-ModArithmetic.html#v:expSafe)。
有人能给我建议最好的策略或者我错过的东西吗?

wr98u20j

wr98u20j1#

包括Paillier在内的所有部分同态加密算法都是基于模运算的。即使你喜欢负数,它们在定义的模上仍然是正数。
让我们用LightPHE for Paillier的例子来解释这个问题。密码系统定义为对明文取模n,对密文取模n^2。因此,负数等价于负数本身取模n。

# !pip install lightphe
from lightphe import LightPHE

# build a cryptosystem with random keys
cs = LightPHE(algorithm_name="Paillier")

# modulo of the cryptosystem
modulo = cs.cs.plaintext_modulo

# define a plaintext
m = -10

# calculate ciphertext
c = cs.encrypt(plaintext=m)

# proof of work
assert cs.decrypt(c) == m % modulo

字符串

相关问题