ECC twin กระจาย
ในระหว่างที่ฉันใช้ CommonCrypto จาก iOS ฉันสังเกตเห็นว่ามีฟังก์ชั่นที่เรียกว่าCCECCryptorTwinDiversifyKeyซึ่งมีคำอธิบาย:
กระจายคีย์ EC ที่กำหนดโดยการรับสองสเกลาร์ $u,v$ จากเอนโทรปีที่กำหนด
แต่คำอธิบายทำให้ฉันเดาได้ว่าฟังก์ชันนี้ทำหน้าที่อะไรหรือใช้เมื่อใด การมองหา "EC diversify" และ "EC twin diversify" บนอินเทอร์เน็ตทำให้ผมไม่ได้รับความนิยมเช่นกัน คำถามของฉันคืออะไรคือความหลากหลายคู่เมื่อพูดถึงคีย์ EC และใช้เมื่อใด
คำตอบ
Twin Diversify
มีเพียงแหล่งเดียวที่ฉันสามารถหาได้ โอเพ่นซอร์สของ 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 หากคุณใช้คีย์สาธารณะเดียวกันคุณจะเชื่อมโยงตลอดเวลา หากคุณสามารถกระจายคีย์สาธารณะของคุณด้วยคีย์ส่วนตัว / คีย์สาธารณะของคุณคุณจะสามารถใช้ข้อมูลประจำตัวใหม่ที่หลากหลายและคุณไม่สามารถเชื่อมโยงกับข้อมูลประจำตัวเดิมของคุณได้อย่างง่ายดาย
ในรูปแบบข้างต้นคีย์สาธารณะใหม่ที่มีความหลากหลาย $u$ และ $v$ จะ $$[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}$เราพูดง่ายๆว่ามันจะไม่เกิดขึ้น ดังนั้นการชนกันจะไม่เกิดขึ้นสำหรับ Curves 256 บิตเช่น P-256 หรือ Curve25519
อะไรคือข้อดีของสิ่งนี้แทนที่จะสร้างตัวตนใหม่
ข้อแตกต่างที่สำคัญคือคุณสามารถพิสูจน์ได้อย่างง่ายดายว่าข้อมูลประจำตัวนี้เชื่อมต่อกับข้อมูลประจำตัวเริ่มต้นโดยระบุไฟล์ $u$ และ $v$. การเชื่อมต่อข้อมูลประจำตัวแบบสุ่มกับข้อมูลประจำตัวเริ่มต้นของคุณเท่ากับปัญหา Dlog
หมายเหตุ:ฉันไม่พบเอกสารทางวิชาการที่อยู่เบื้องหลังแนวคิดนี้ ฉันจะดีใจถ้าใครบอก