我熟悉理论方面的大多数公钥加密(无论Katz / Lindell书中有哪些解释),但我没有任何实用的编程方面。
我的问题直接针对Paillier及其实施。
我需要代表以下正式的各种无线电配置:
无线电1 = [ch_1 = 1,ch_2 = 0,ch_3 = 0 ...,ch_32 = 1],其构成由32个信道组成的单个无线电的配置。每个通道可以是ON或OFF(1或0)
每个这样的配置因此需要32位数据。如果我想在“块”中表示32个这样的无线电,它将包含1024位数据。
问题是我需要在一个数据块中代表几十倍于无线电配置的数量。换句话说,我需要代表接近302个无线电配置,每个配置包含一个“块”中的32位数据,每个块总共有大约9664位数据。
我从Paillier有更多实践经验的同事那里得知,我们不能将超过1024位打包成Paillier密文。我想知道这个陈述是否属实(不可能将超过1024位打包到Paillier密文中),如果是这样,背后的原因是什么?或许在密文中加入更多内容会使从计算角度使用它是不切实际的吗?
我们打算将Paillier用于私人信息检索计划。
实现最有可能在C ++中完成
谢谢。
答案 0 :(得分:0)
与其他一些加密系统一样,Paillier密钥生成通过选择两个大素数p,q
并设置n=p*q
开始。由于消息必须在Z/nZ
中(这表示模数为n),如果选择1024位实现(即n
有1024位),则无法编码单步执行大于1024位的消息。
但是,没有什么可以阻止您将较大的消息拆分为许多较小的块并单独加密每个块。在您的情况下,前32个无线电的状态将为第一个块,然后您加密并发送。重复33-64等无线电状态等。
答案 1 :(得分:0)
我知道这个问题已经过时了,但我认为我的观察是有效的。
首先:永远不要使用非对称密码作为分组密码。这具有安全性和性能影响。如果您需要加密大块数据,使用对称密码(例如AES),它将表现得更好,并且安全(如果使用得当)可用作分组密码。如果需要,使用非对称密码交换对称密钥。
现在关于Paillier。您可以使用Paillier加密的数据量限制为“n”,不包括在内。通过选择两个大的素数“p”和“q”来生成“n”,使得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位。但要记住:随着你增加素数大小,你会降低性能。因此,在选择素数大小时,您应该在性能和安全性之间找到一个很好的平衡点。 n
3072是Paillier的不错选择。
总结:不要使用Paillier或任何其他非对称密码来阻止密码。使用它们来交换对称密钥,然后使用对称密码,具有良好的操作模式(如CTR。不要使用ECB)。