我正在使用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)。
有人能给我建议最好的策略或者我错过的东西吗?
1条答案
按热度按时间wr98u20j1#
包括Paillier在内的所有部分同态加密算法都是基于模运算的。即使你喜欢负数,它们在定义的模上仍然是正数。
让我们用LightPHE for Paillier的例子来解释这个问题。密码系统定义为对明文取模n,对密文取模n^2。因此,负数等价于负数本身取模n。
字符串