从两个流

时间:2015-09-27 11:25:20

标签: algorithm encryption

我在Java中添加了两位比特的相应位,如下所示:

1 0 1 1 0 0
1 0 1 0 1 0
====================
2 0 2 1 1 0

在此之后我将结果添加为:

2+0+2+1+1+0 = 6

现在,我必须在结果(6)中找出匹配位和非匹配位的1ns和2s的数量。我努力设置这样一个算法,它可以告诉我结果由1ns和2s组成的确切数量,但到目前为止我无法创建任何数据。 它允许每个加法结果乘以常数。可以减去各个位以实现上述目标。

我也可以像上面添加的那样将这些单位相乘。但我不能添加这些位也不是结果。比特可以与自身或任何其他比特相乘。即使我可以用我选择的数字来表示这些位。那就是我可以说1 = 2和0 = 3然后我可以:

添加(Pascal Paillier):

2 3 2 2 3 3
2 3 2 3 2 3
====================
4 6 4 5 5 9

对于乘法(RSA)

2 3 2 2 3 3
2 3 2 3 2 3
====================
4 9 4 6 6 9

唯一的目的是找出相似位(1& 1)的数量,并通过添加来生成总数中的非相似位(0& 1,1& 0) (Pascal Paillier)或乘法(RSA)。 此外,第二比特流可以用与上述不同的数字表示。

以下也可以使用:

  1. 使用位和结果进行乘法,并使用常数
  2. 进行指数运算
  3. 比特和结果之间的加法/减法和仅与常数相乘
  4. 更多细节: 我使用Pascal Paillier同态算法来加密这些单独的位。 Pascal Paillier仅支持加密数据,因此我只需添加。我必须将此号码发送给某些应用程序,这些应用程序必须找出匹配位和非匹配位的确切数量。 此外,我可以使用RSA,但它只允许乘法。

1 个答案:

答案 0 :(得分:0)

一般来说,从两个原始的 a b 位流中,您需要执行类似

的操作
popcnt(a XOR b) = # of non-matching bits (pairs of 0,1 and 1,0)
popcnt(a AND b) = # of matching 1-bits (pairs of 1,1)

其中 popcnt 是结果字符串的Hamming weight

如果您碰巧在支持SSE4 POPCNT指令(过去7年生产的AMD和Intel处理器)的处理器上进行编译,这可能是解决问题的最佳方式。例如,两者的实现(一次从流 a b 测试一个int大小的位数)

int nonmatch(int a, int b) {
    return __builtin_popcount(a ^ b);
}

int match(int a, int b) {
    return __builtin_popcount(a & b);
}

将产生汇编代码

; nonmatch
xor    %esi, %edi
popcnt %edi, %eax
retq

; match
and    %esi, %edi
popcnt %edi, %eax
retq

分别