为了完全理解ECIES并使用我最喜欢的库,我自己实现了ECIES的一些部分。这样做并比较结果导致了一个我不太清楚的点:KDF的输入到底是什么?
ECDH的结果是一个向量,但是你对KDF使用什么呢?它只是X值,还是X Y(可能带有前置的04)?你可以在野外找到这两个概念,为了可重复性,哪种方式是正确的方式会非常有趣(如果有正确的方式——我知道ECIE更像是一个概念,有几个自由度)。
解释(如果我在特定的点上错了,请纠正我)。如果我谈论字节长度,这将指具有256位EC键的ECIES。
所以,首先,大局:这是ECIES过程,我说的是第2步-
接收者的公钥是向量V,发送者的强调私钥是标量u,密钥协商函数KA是ECDH,基本上是V*u的乘法。结果,你得到一个共享密钥,它也是一个向量——让我们称之为“共享密钥”。
然后,您获取发送者的公钥,将其与共享密钥连接,并将其用作密钥导出函数KDF的输入。
但是:如果您想将此向量用于键派生函数KDF,您有两种方法:
字节串的长度并不重要,因为在KDF(通常涉及散列)之后,您总是有一个固定值,例如32字节(如果您使用sha256)。
但是当然,如果你选择一种或另一种方法,KDF的结果是完全不同的。所以问题是:正确的方法是什么?
所以,我试图在留档中获取更多信息:
所以,结果是:我很困惑。有人能给我指出正确的方向吗,或者这只是你拥有的一定程度的自由(以及在兼容性方面有很多乐趣的理由)?
回答我自己的问题:是的,这是一个自由度。X坐标方式被称为紧凑表示,它在RFC6090中定义。所以两者都是有效的。
它们也同样安全,因为可以如附录CRFC6090中所述从X中计算出Y。
默认方式是使用紧凑表示。这两种方式彼此不兼容,所以如果您偶然发现库之间的兼容性问题,这可能是一个有趣的发现点。