ECC twin กระจาย

Nov 10 2020

ในระหว่างที่ฉันใช้ CommonCrypto จาก iOS ฉันสังเกตเห็นว่ามีฟังก์ชั่นที่เรียกว่าCCECCryptorTwinDiversifyKeyซึ่งมีคำอธิบาย:

กระจายคีย์ EC ที่กำหนดโดยการรับสองสเกลาร์ $u,v$ จากเอนโทรปีที่กำหนด

แต่คำอธิบายทำให้ฉันเดาได้ว่าฟังก์ชันนี้ทำหน้าที่อะไรหรือใช้เมื่อใด การมองหา "EC diversify" และ "EC twin diversify" บนอินเทอร์เน็ตทำให้ผมไม่ได้รับความนิยมเช่นกัน คำถามของฉันคืออะไรคือความหลากหลายคู่เมื่อพูดถึงคีย์ EC และใช้เมื่อใด

คำตอบ

2 kelalaka Nov 10 2020 at 20:01

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


หมายเหตุ:ฉันไม่พบเอกสารทางวิชาการที่อยู่เบื้องหลังแนวคิดนี้ ฉันจะดีใจถ้าใครบอก