Reedsolomon多项式Coeffs解码返回空字节数组

时间:2018-07-21 13:07:46

标签: python numpy cryptography decoding reed-solomon

我正在尝试一种密码学算法。该过程应该很简单:

它保护消息msg = b'Sample' 通过传递IPI点,我们可以说:ipi = np.array([1,2,3,4,5])

通过对消息进行编码来生成多项式系数,从而通过RSCodec。通过将IPI点传递给多项式,它会在过程结束时生成一个保管库。

成功。它会生成一个保管库(N,2)形的np.int64矩阵,表示x和y坐标集。

但是,在解码消息时会出现问题。因此,为了恢复邮件,我要做的就是。

  1. 对应的y-每个和x坐标的坐标查找。这将返回一组表示为np.64矩阵的(x,y)。

  2. 通过使用在步骤1中生成的点,我尝试通过计算拉格朗日插值多项式系数来对多项式系数进行解码,以恢复多项式系数。

  3. 最后,现在我获得了多项式系数,我再次通过RScodec对其进行了解码,以期取回已解码的消息。但是我反而空了。一个简单的rs.decode()

因此,我的代码段中的一个简短代码段是:

解码

def get_points(ipi, vault):
    ixs = np.in1d(vault[:,0], ipi)
    points = vault[ixs]
    return points

def decode_coefficients(points):
    xs = points[:,0]
    ys = points[:,1]
    coeffs = poly_to_coeffs(lagrange(xs,ys))
    # return as bytearray:
    return bytearray(coeffs.astype(int).tolist())

对于编码,它非常简单:

def encode(msg, ipi):
  coefficients = rs.encode(msg)
  vault = projection(coefficients, ipi)
  return vault

def projection(coeffs, ipi):
  y = np.polyval(coefffs,ipi).astype(np.int64) % modulus
  return np.stack([ipi,y], axis=1)

这是我测试的一些日志。

msg = b'Sample'
ipi = np.array([1,2,3,4,5])




Generate fuzzy vault: bytearray(b'Sample')
[[ 10 100]
 [ 57  70]
 [ 66  83]
 [ 65 160]
 [ 21  34]
 [  5 100]
 [ 24 145]
 [ 53  16]
 [  4   2]
 [ 36   2]
 [  9  59]
 [ 38 183]
 [  2 154]
 [ 67 167]
 [  3 108]
 [ 62  58]
 [ 74   7]
 [ 18  31]
 [  1  84]
 [  6 186]
 [ 11 111]
 [ 46 166]
 [ 32 127]]
Process finished in: 0.04680013656616211

-------------------------Unlocking vault

Unlocked fuzzy vault:   
bytearray(b'')

我只是为了学习而编码。我在做什么错了?

到目前为止我尝试过的事情:

  1. 切换到unireedsolomon。
  2. 直接使用reedsolo库(不使用RSCodec)-import reedsolo as rs
  3. 校准erase_pos

1 个答案:

答案 0 :(得分:0)

看着它,我想我以前看过类似的东西,但是它使用的是Galois字段,但是您是否不需要首先获取检索点的子集?在将其扔到decode_coeff函数之前?