我正在尝试一种密码学算法。这个过程应该很简单:
它保护消息msg = b'Sample'
通过IPI点,假设:ipi = np.array([1,2,3,4,5])
通过RSCodec对消息进行编码,生成多项式系数。通过使IPI点通过多项式,它在过程结束时生成一个vault。
这是成功的。它生成一个表示x和y坐标集的vault(N,2(形状的np.int64矩阵。
然而,在对消息进行解码时,会出现问题。因此,为了恢复消息,我所要做的就是。
-
对应的y坐标查找per和x坐标。这返回一组(x,y(,表示为np.64矩阵。
-
通过使用步骤1中生成的点,我试图通过计算拉格朗日插值多项式系数对其进行解码来恢复多项式系数。
-
最后,现在我得到了多项式系数,我再次通过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'')
我只是为了学习而编代码。我做错了什么?
到目前为止我尝试了什么:
- 切换到unireedsolomon
- 直接使用reedsolo库(不使用RSCodec(-
import reedsolo as rs
- 校准
erase_pos
看着它,我想我以前看到过类似的东西,但它使用的是伽罗瓦域,但你不需要先得到检索点的子集吗?在将其抛出到decode_coeff
函数之前?