ECC雙胞胎多元化
在我從 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 $$
**注意:**我找不到這個想法背後的學術論文。如果有人告訴我,我會很高興。