Elliptic-Curves

ECC雙胞胎多元化

  • January 12, 2022

在我從 iOS 實現 CommonCrypto 的過程中,我注意到有一個名為的函式CCECCryptorTwinDiversifyKey,其描述是:

通過派生兩個標量使給定的 EC 密鑰多樣化 $ u,v $ 從給定的熵。

但描述讓我猜測該函式的作用或使用時間。在網際網路上尋找“EC diversify”和“EC twin diversify”也沒有讓我成功。所以我的問題是:在談到 EC 密鑰以及何時使用它時,什麼是雙胞胎多樣化?

雙胞胎多元化

我只能找到一個來源;Apples 的 CommonCrypto 的開源。全部來自CommonECCryptor.h

@function   CCECCryptorTwinDiversifyKey

@abstract   Diversifies a given EC key by deriving two scalars u,v from the
            given entropy.

@discussion entropyLen must be a multiple of two, greater or equal to two
            times the bitsize of the order of the chosen curve plus eight
            bytes, e.g. 2 * (32 + 8) = 80 bytes for NIST P-256.

            Use CCECCryptorTwinDiversifyEntropySize() to determine the
            minimum entropy length that needs to be generated and passed.

            entropy must be chosen from a uniform distribution, e.g.
            random bytes, the output of a DRBG, or the output of a KDF.

            u,v are computed by splitting the entropy into two parts of
            equal size. For each part t (interpreted as a big-endian number),
            a scalar s on the chosen curve will be computed via
            s = (t mod (q-1)) + 1, where q is the order of curve's
            generator G.

            For a public key, this will compute u.P + v.G,
            with G being the generator of the chosen curve.

            For a private key, this will compute d' = (d * u + v) and
            P = d' * G; G being the generator of the chosen curve.

案例

當我們想要某種程度的匿名性時,多樣化是必要的,就像在 CryptoCurrencies 中一樣,如果你使用相同的公鑰,你就會一直連結。如果你可以用你的私鑰/公鑰使你的公鑰多樣化,那麼你就可以使用多樣化的新身份,並且你不能輕易地與你原來的身份聯繫起來。

在上述方案中,新的公鑰 $ P’ $ 與目前公鑰不同 $ P $ 和 $ u $ 和 $ v $ 將會$$ P’ = [u]P + [v]G $$並且多樣化的私鑰將是

$$ d’ = (d \cdot u + v) $$並驗證多樣化的公鑰

$$ P’ = [d’]G = [d \cdot u + v]G = [d \cdot u]G + [v]G = [u]P + [v]G $$

總之,你有了新的身份,但在幕後,依然是你。

有多少人可以安全地多元化?

要回答我們需要一些假設,讓使用者可以生成 $ u,v $ 隨機均勻——這很關鍵——有 $ 2^{30} $ 系統使用者——略超過十億——每個使用者都有多元化 $ 2^{20} $ 他們一生中的時間-略高於一百萬-。

現在我們將使用經典的生日計算來查看一條曲線的碰撞機率 $ 2^{256} $ 公鑰。

我們將使用這樣一個事實,即均勻隨機選擇的碰撞機率 $ k $ 集合中的元素 $ n $ 元素可以近似為

$$ (2^{k})^2/2^{n}/2=2^{2k-n-1} $$

我們的 $ k = 2^{50} $ 和 $ n = 2^{256} $ , 然後;

$$ (2^{50})^2/2^{256}/2 = 2^{100 - 256 - 1} = 1/2^{157}. $$

當碰撞機率在附近時 $ 1/2^{100} $ 我們只是說它不會發生。因此,對於像 P-256 或 Curve25519 這樣的 256 位曲線,碰撞可以忽略不計(不會發生)。

這樣做的好處是什麼,而不是僅僅創建一個新的身份?

主要區別在於,您可以通過提供 $ u $ 和 $ v $ .

我可以將我的身份與另一個身份關聯嗎?

將隨機身份與您的初始身份聯繫起來等於離散對數問題,因為我們不知道私鑰。

如果我們知道私鑰 $ d $ 和 $ d’ $ 那麼孿生分集連接是一項微不足道的任務。隨機生成 $ u $ 然後解決 $ v $ ;

$$ v = d’ - d \cdot u $$


**注意:**我找不到這個想法背後的學術論文。如果有人告訴我,我會很高興。

引用自:https://crypto.stackexchange.com/questions/86073