0

我熟悉大多数理论方面的公钥加密(无论 Katz/Lindell 书中解释了什么),但我没有任何实际的编程方面。

我的问题直接针对 Paillier 及其实施。

我需要代表具有以下形式的各种无线电配置:

radio 1=[ch_1=1, ch_2=0, ch_3=0...,ch_32=1] 这构成了由 32 个通道组成的单个无线电的配置。每个通道可以打开或关闭(1 或 0)

因此,每个这样的配置都需要 32 位数据。如果我想在一个“块”中表示 32 个这样的无线电,它将由 1024 位数据组成。

问题是我需要在一个数据块中表示几乎 10 倍以上的无线电配置数量。换句话说,我需要表示接近 302 种无线电配置,每一种都由单个“块”中的 32 位数据组成,每个块总共大约 9664 位数据。

对 Paillier 有更多实践经验的同事告诉我,我们不能将超过 1024 位打包到 Paillier 密文中。我想知道这个说法是否属实(不可能将超过 1024 位打包到 Paillier 密文中),如果是,那么背后的原因是什么?从计算的角度来看,也许将更多内容打包到密文中会使使用变得不切实际?

我们打算将 Paillier 用于私人信息检索方案。

该实现很可能在 C++ 中完成

谢谢你。

4

2 回答 2

0

与其他一些加密系统一样,Paillier 密钥生成首先选择两个大素数p,q并设置n=p*q. 由于消息必须是 in Z/nZ(这表示整数模 n),如果您选择 1024 位实现(即n具有 1024 位),您不能在单个步骤中编码大于 1024 位的消息,这确实是正确的。

但是,没有什么能阻止您将较大的消息拆分为许多较小的块并单独加密每个块。在您的情况下,前 32 个无线电的状态将形成第一个块,然后您将其加密并发送。重复无线电 33-64 等的状态。

于 2013-09-23T14:31:33.077 回答
0

我知道这个问题很老,但我认为我的观察是有效的。

首先:永远不要使用非对称密码作为分组密码。这具有安全性和性能影响。如果您需要加密大块数据,请使用对称密码(例如 AES),它的性能会更好,并且用作分组密码是安全的(如果使用得当)。如果需要,请使用非对称密码交换对称密钥。

现在关于Paillier。您可以使用 Paillier 加密的数据量限制为“n”,不包括在内。“n”是通过选择两个大素数“p”和“q”生成的,这样n = p*q. 那你一定有消息了m < n。也就是说,消息“m”应该小于“n”。假设您有这样的文本:radio. 您可以将其以二进制形式表示为:01110010 01100001 01100100 01101001 01101111 00001010. 如果读取01110010 01100001 01100100 01101001 01101111 00001010为数字,您会得到:m = 125762622025482. 如果你有m < n,那么你可以加密“m”。

现在关于这个说法:

对 Paillier 有更多实践经验的同事告诉我,我们不能将超过 1024 位打包到 Paillier 密文中。

这是错误的。Paillier 与其他非对称密码一样,几乎在所有情况下都会扩大明文的大小。也就是说,以比特为单位的密文的大小将大于以比特为单位的纯文本的大小。决定明文和密文的最大大小的是n,它受质数p和的限制q。因此,只要选择足够大的素数,就可以在密文中打包超过 1024 位。但请记住:当您增加素数大小时,您会降低性能。因此,在选择素数大小时,您应该在性能和安全性之间找到一个很好的平衡点。n3072 是 Paillier 的不错选择。

总结一下:不要使用 Paillier 或任何其他非对称密码作为分组密码。使用它们交换对称密钥,然后使用具有良好操作模式的对称密码(如 CTR。不要使用 ECB)。

于 2017-06-28T01:19:24.003 回答