ECDHのshared keyの圧縮

頼性のない通信路上でどうやって秘密にすべき両者の鍵を共有するか。

  1. alice は bob に対して、alice の公開鍵 Qa=daG を渡します。bob は alice の公開鍵を元にしてK=dbQa=dadbG を計算します。
  2. bob は alice に対して、bob の公開鍵 Qb=dbG を渡します。alice は bob の公開鍵を元にしてK=daQb=dadbG を計算します。

こうすると、両者はともに K=dadbG という楕円曲線上の点を得ます。この点の x 座標が、共有すべき鍵になります。 一般には、それをそのまま鍵として使うのではなく、さらにそこからハッシュ関数を通した値を通すのが安全とされています。

X座標を計算すれば共有鍵ができるはずなのに、btcdではyも計算して、それを使ってcompressしている。

// SerializeCompressed serializes a public key in a 33-byte compressed format.
func (p *PublicKey) SerializeCompressed() []byte {  
    b := make([]byte, 0, PubKeyBytesLenCompressed)
    format := pubkeyCompressed
    if isOdd(p.Y) {
        format |= 0x1
    }
    b = append(b, format)
    return paddedAppend(32, b, p.X.Bytes())
}

これ、どう判断すればいいんだろう。