我正在尝试一种密码学算法。这个过程应该很简单:
msg = b'Sample'
它通过传递 IPI 点来保护消息,比方说:ipi = np.array([1,2,3,4,5])
通过 RSCodec 对消息进行编码,生成多项式系数。通过多项式传递 IPI 点,它会在过程结束时生成一个保险库。
这是成功的。它生成一个 vault (N,2) 形的 np.int64 矩阵,表示一组 x 和 y 坐标。
但是,在解码消息时会出现问题。因此,为了恢复消息,我所要做的就是。
对应的 y - 坐标查找每个和 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