בסיס ידע: הצפנת עמידות קוונטית

Nymchat whitepaper טכני

הסכם מפתח פוסט קוונטי ב-Nymchat

הפצה של מפתחות ציבוריות של ML-KEM-768 על פני Nostr ללא תיקיה או רישום, ושיפוץ אותן מתוך סוד שאינו מגלה ערך ציבורי.

גרסה 1.0 אוגוסט 2026 חל על Nymchat 3.74+

הוספת חילופי מפתחות פוסט קוונטיים לשליח היא בעיקר לא בעיה קריפטוגרפית.הפרמיטיביים סטנדרטיים והספריות קיימות.החלק הקשה הוא שכל משתתף זקוק כעת השני מאמר זה מתאר כיצד Nymchat עונה לזה - מאיפה המפתח השני מגיע, איך הוא מגיע לאנשים הדורשים אותו, ומה הממשק מותר לטעון לגבי התוצאה - ובסעיף האחרון, מה התוצאה הזאת לא מגנה.

1הבעיה

הודעות הפרטיות שלנו מוצפנות עם NIP-44המחצית המפרידה את הטקסט הפשוט – ChaCha20 עם תגית HMAC-SHA256, מפתחת דרך HKDF (רויטרס 5869) - אינו מאיים באופן משמעותי על ידי מחשב קוונטי; אלגוריתם של גרובר עולה מהירות של שורש רבוע נגד מפתח סימטרי, ו- 256 ביטים סופגים את זה. מסכימה הקו האליפטי Diffie-Hellman Over תגיות256k1חיזוק מפתח פרטי אחד מהשותף הציבורי שלו מפגין באופן רטרוקטיבי כל סוד משותף שהמפתח אי פעם יצר.

האיום הזה יוצר אינו מתעכב עד שהמכונה כזו קיימת. יריב עם אחסון יכול להקליט טקסט הצפנה היום ולהחליף אותו בכל פעם שהיכולת מגיעה. כל דבר שנשלח עכשיו שעדיין חשוב אז כבר פוגע.

1.1 התשובות לשאלה זו

יש להבין את ההבדל בין מנגנון ההדפסה לבין המנגנון ההדפסה, כך שניתן להשתמש במנגנון ההדפסה (למשל, במנגנון ההדפסה של המנגנון ההדפסה).פיפ"א 203זה מייד מעלה בעיה של הפצה:

השאלה

כדי לשלוח הודעה אליס היום, אתה צריך דבר אחד: npub שלה.הוספת חילופי פוסט קוונטים ואתה צריך שניה - המפתח הציבורי שלה ML-KEM.איפה המפתח הזה חי, ואיך אתה מקבל אותו לפני שאתה יכול לשלוח לה משהו?

אתה יכול לכתוב אותו על נייר, לקרוא אותו בקול רם, או לסרוק אותו מהמסך, וזה כל מה שמישהו צריך להצפין בשבילך. ML-KEM-768 מפתח ציבורי הוא 1,184 בייטים. זה לא יכול להיקרא בקול רם, זה לא יתאים בשם משתמש, וזה לא שייך לקוד QR מלבד זהות כי הוא רק 32 בייטים.

החלק הקשה ביותר הוא כי מפתח שני מביא שלושה בעיות נפרדות, והשאר של נייר זה הוא בעיקר תשובה אליהם:

2עיצוב מגבלות

ארבעה מגבלות ציינו את התשובה, והן מבטלות את רוב העיצובים הברורים לפני שכל קוד נכתב.

  1. כמה שיותר סודות. כל סוד נוסף הוא דרך נוספת לאבד את ההיסטוריה שלך, ומישהו שיודע להגן על nsec לא יודע להגן על שום דבר אחר. סעיף 3.1 מראה את זה לא יכול להיפגש ישירות - מפתח פוסט קוונטי שנגרם מן nsec אינו מספק הגנה פוסט קוונטית בכלל - אז העיצוב משקיע בדיוק סוד אחד ולא יותר: חתיכה אחת של חומר מפתח, שנוצר פעם אחת לפי זהות, מוצג באותה צורה כמו nsec ובמקום זה, כך שכל מי שיודע איך לשמור את אחד יודע איך לשמור את השני.
  2. אין סמכות אין שרת שאפשר לסמוך עליו כדי לומר איזה מפתח שייך למי.
  3. מכשירים רבים, זהות אחת זהות Nostr משמשת בדרך כלל ממספר לקוחות בו זמנית.כל חומר מפתח קיים חייב להיגמר זהה על כולם, והדרך שמביאה אותו לשם לא חייבת להיות קריאה על ידי היריב שהפונקציה מגנה עליה.
  4. בלי משא ומתן כל חילוף בתוך הלהקה של “איזה סיפרים אתה תומך?” הוא משטח שהתקף יכול לחתוך כדי לכפות את האפשרות החלשה יותר.

3סוד שורש עצמאי

ההחלטה החשובה היא כי מפתח ML-KEM decapsulation נזרע מן החומר המפתח שאין ערך ציבורי לחשוף.

pqRoot   = 32 bytes from a CSPRNG, generated ONCE per identity

seed     = HKDF-Expand(
               HKDF-Extract(salt = "nym-pq-root-v2", IKM = pqRoot),
               info = "mlkem768/epoch/" || epoch,
               64 bytes)

(ek, dk) = ML-KEM-768.KeyGen(seed)

השורש מוצג למשתמש כמו nsec הוא: בייביסיטר32 עם הקוד האנושי-קריא nympqוכך הוא קורא כמו nympq1…, המוצג לצד nsec במסך הזהות מאחורי אותה אינטראקציה לחשוף, עותק עם אותו בקרה, מעולם לא נרשם ולא נשלח בשום מקום ברור.

המלח הוא נפרד תחום בכוונה, כך שאף סוד אחר לא יכול לעקוב אחר אותו זוג מפתחות. epoch מנגנון ההפעלה (סעיף 9 )

3.1 מדוע המפתח לא יכול להיות מופק ממפתח הזהות

העיצוב המובן מאליו הוא לשתול את keypair מן הסוד שהמשתמש כבר יש:

seed = HKDF(salt = "…", IKM = nsec)          // do not do this

זה אטרקטיבי בשל ארבעה סיבות, כל אלה אמיתיים: שום דבר חדש להגיב, כי nsec הוא כבר גיבוי; כל מכשיר הסכים על ידי הבנייה, ללא פרוטוקול סינכרון ללכת לטעות; הודעה אחת להחליף על ידי זהות להיות ברור נכון, כי מכשירים לא יכולים להתווכח על המפתח; ואת המפתח הקיים לפני שהוא מפורסם אי פעם, כך לקוח יכול לסגור משהו לעצמו בהתחלה.

כל ארבעת היתרונות חסרי ערך, מסיבה אחת.אלגוריתם של שור פועל נגד npub שפורסם נותן את nsec. ההפצה של זרעים היא אלגוריתם ציבורי מעל nsec. אז היריב שבור את המחצית הקלאסית מחדש את המחצית הפוסט קוונטית על ידי הפעלת אותו HKDF שכולם אחרים פועלים.

הכלל הכל תלוי

מפתח ML-KEM Decapsulation חייב לבוא מאנטרופיה שאינה ניתנת להורדה מ- nsec ולא מועברת מעולם תחת הצפנה קלאסית בלבד.

סוד שנוצר באופן עצמאי לאחר מכן מסונכרן בין המכשירים של המשתמש בתוך הודעת NIP-44 רגילה הוא אותה כישלון עם צעדים נוספים: יריב רשום את ההודעה היום ומחזיר את המפתח הקלאסי שלו מאוחר יותר, והשורש נופל.

3.2 קבלת השורש למכשירים אחרים של המשתמש

הגבלת 3 של סעיף 2 – זהות אחת, מכשירים מרובים – לא יכולה להיות מסופקת כאן על ידי ארכיטקטורה, משום שהדבר כולו הוא שהמפתח אינו פונקציה של כל דבר שהמכשירים כבר חולקים. nympq1… הקוד עצמו

השורש מוצג כ nympq1… לצד ה- nsec, מכשיר שני מקבל אותו מוטבע באותו לוח.זהו המנגנון כולו.מכשיר שלא נתן לו את הקוד לא יכול להשתתף, אשר סעיף 4.2 מתאר.

העברה ידנית היא קרקע מכוונת ולא צעד ראשון.הכלל בסעיף 3.1 אומר שהשורש עשוי לעולם לא לנסוע תחת הצפנה קלאסית בלבד, וכל מנגנון שיעשה זאת אוטומטית – סינכרון באמצעות רייל, אריזת אותו למפתח הזהות – פוגע בדיוק בזה.

הפורמט משאיר מקום למסלול מעוטר: רשומה עשויה להכיל רשימה של מעוטרים, כל אחד עם blob AEAD תחת מפתח שהמשתמש יכול לשחזר במכשיר אחר - יציאת PRF passkey, למשל. nympq1… כל מה שאנחנו צריכים לעשות הוא לקחת את זה בחשבון, סעיף 10.1 מסביר את העלות.

הקובץ עצמו חי בקטגוריה ההגדרות שלו, nymchat-pq-rootגם אם הוא לא נושאת חבילות, הוא עושה את העבודה הנדרשת: נוכחותו היא איך מכשיר שני לומד כי זהות זו כבר יש שורש, וזה מה שמונע ממנו לנסח אחד יריב (סעיף 3.3).

הערה עיצובית: הקטגוריה היחידה שאינה יכולה להשתמש במפתח החדש

The nymchat-pq-root קטגוריה MUST לֹא שורה זו נושאת את העותק היחיד של השורש, ולכן סגירתו תחת מפתח שנגרם מהשורש היא מנעול שמפתחו נמצא בתוך התיבה: שום מכשיר לא יוכל לפתוח אותו, כולל זה שכתב אותו.

כל קטגוריה אחרת של הגדרות עשויה וצריכה להשתמש במפתח השורש, זהו החריג היחיד, והוא חריג לגבי מעגלות ולא על כוח.

3.3 הדור והאימוץ

על boot, מחזיק זהות קבועה, לקוח פועל בסדר זה:

  1. חפש את הנוכחי nymchat-pq-root שיא
  2. הקלטה נמצאה, ומכשיר זה יכול לפתוח אותו - לאמץ אותו ולהכריז על זהות זו ככוח פוסט קוונטי.
  3. הקלטה נמצאה, ומכשיר זה לא יכול לפתוח אותה - לא ליצור שורש חדש, ולא לפרסם שום הודעה בכלל. nympq1… מכשיר שכבר יש לו אותו.
  4. אין שיא - ליצור שורש, לפרסם את ההקלטה, להודיע ולהציג את nympq1… הקוד נמסר למשתמש פעם אחת כדי שיוכל לשמור אותו.

שלב 3 הוא שלב קל לטעות, וזו הסיבה שהסדר נכתב ולא נשאיר לכל יישום.שני מכשירים שכל אחד מהם מחליט ליצור שורש מייצרים שני שורשים עצמאיים תחת זהות אחת, וזה הכישלון שהסדר הזה קיים כדי למנוע.

4הכרזת היכולת

מחצית הציבורית של זוג המפתחות המשויך מפורסמת ככתובת יונייטד-01 אירוע - סוג 30078, תוויות nym-pq:

{
  "kind": 30078,
  "tags": [
    ["d", "nym-pq"],
    ["t", "nym-pq"],
    ["expiration", "<unix seconds>"]
  ],
  "content": {
    "v":     2,
    "alg":   "mlkem768",
    "nym":   1,
    "epoch": 0,
    "pk2":   "<base64url ML-KEM-768 encapsulation key>",
    "exp":   <unix seconds>,
    "devices": [ ... ]
  }
}

Addressable פירושו שהמעבר שומר אירוע אחד לכל אירוע (kind, pubkey, d-tag), כך רפובליקה מחליפה את ההכרזה הקודמת במקום.

החתימה היא מחייבת. האירוע נחתם על ידי המפתח הזהות, ולכן הטענה &ldquo;המפתח ML-KEM הזה שייך ל- npub זה&rdquo; היא בדיוק חזקה כמו npub עצמו.

ההודעות מסתיימות שבעה ימים NIP-40 תאריך יציאה, שפורסם מחדש כל 24 שעות, שומר על רשומה הצהרה על לקוח שעדיין פועל במקום אחד שהיה בעבר.

הודעה שנעלמה נקראת בדיוק כמו זו שמעולם לא הביאה מפתח: עמיתים שולחים NIP-44 רגיל, שכולם יכולים לקרוא אותו, והלקוח ממשיך את חילופי הפוסט קוונטים על החיבור הבא שלו, כאשר הוא מפרסם מחדש, כך שקט במשך יותר משבוע עולה על ההגנה על ההודעות שנשלחו במהלך הפער – הן מוצפנות באופן קלאסי ולא כנגד קוונטים – ולא עולה דבר אחר.

ללא זה, רשומה עברה את המפתח שהיא מכנה: מכשיר שנמחק, מחדש, או שיש לו את השורש שלו מחליף משאיר הוראה קבועה לכסות את המפתח שאף אחד לא מחזיק יותר, והודעות שנשלחו תחת זה אבדו ללא שגיאה בשני הצדדים.

שדה המפתח מכנה את התבנית שלו. השדה הוא pk2קורא שאינו מזהה את השדה מסתיים הלקוח, אין מפתח פוסט קוונטי&rdquo; ומשלח NIP-44 רגיל, אשר כל כניסה יכולה לקרוא.זה הכיוון הנכון לכישלון, וזה שווה לציין כרגיל את המספרת הפורמט קיים כדי לאכוף: טענה יכולת לא מוכר חייבת להעלות את עלות ההגנה, לעולם לא משלוח. מפתח שמישהו לא יכול להשתמש הוא גרוע יותר מכל מפתח בכלל, כי המסר שהוא מייצר אבוד ללא שגיאה על אף צד.

4.1 היעדרות היא משמעותית, ושלוש הערכה

פרטים רגישים אך חשובים: ההכרזה מפורסמת על ידי כל לקוח Nymchat, לא רק אלה בעלי יכולת פוסט קוונטית, ושדה המפתח הוא אופציונלי.

תצפיתאֶמְצָעִישלח התנהגות
הודעה עם מפתח Nymchat, Post-quantum מסוגל היברידי
הודעה, אין מפתח בכלל Nymchat, קלאסי בלבד – פוסט קוונטי, או מכשיר שעדיין לא קשור לשורש הזהות קלאסי NIP-17
ללא הודעה לקוח לא ידוע יכול להיות כל משתמש של Nostr או Bitchat קלאסיקה, פלוס תאימות

הודעה ללא מפתח היא הצהרת חתימה כי המשלוח פועל Nymchat, המאפשרת למשלוח לעקוף את נתיב המשלוח חבילת פרוטוקול בין ספקטואלית שהיא אחרת צריכה לכלול עבור כל מי שהיא לא יכולה לזהות.

4.2 מכשיר שאינו יכול לפתוח את השורש נשאר שקט

ההכרזה ניתן להחליף: אירוע אחד לכל זהות, כתיבה אחרונה מנצחת.זה מה שעושה את העיצוב של שיא יחיד לעבוד, וזה גם מה שהופך מכשיר לא מקושר מסוכן אם הוא מפרסם.

אז מכשיר שיודע שורש קיים אבל לא יכול לפתוח אותו מפרסם שום הודעה בכלל.זה לא נשבר והוא לא נסגר מהאפליקציה: הוא עדיין קורא כל הודעה שיש לו את המפתחות עבור והוא עדיין שולח באופן קלאסי, תוך דחוף את המשתמש לקשר אותו.

5גילוי והחלטת שליחה

לקוחות לומדים את המפתחות של עמיתים בשני דרכים: מנוי קבוע מכסה את האנשים שהמשתמש מתאים להם – שיחות פתוחות וחברי קבוצה – כך שההודעות שלהם מגיעות כאירועים רגילים.

משתמש שמחבר מכשיר חדש, או שעובר מהתחברות להרחיב דפדפן למפתח מקומי, הופך לפוסט-קוונטי מסוגל באמצע השיחה, ו- permanently cached &ldquo;no&rdquo; היה לשמור אותם על הצפנה קלאסית לכל החיים של ההודעה.

5.1 מדוע אין התקפות הורדה

ההחלטה על הנתיב מופחתת לשאלה אחת:

pq = (we hold a signed, unexpired ML-KEM key for this recipient)

אין משא ומתן על יכולות, אין רשימה של אלגוריתמים נתמכים, ואין שדה שהתקף יכול לנקות כדי לכפות על נתיב חלש יותר. הוא מצב הכשל של הודעה שנמחקת או נמנעת הוא שההודעה הולכת קלאסית - הסטטוס קוו לפני תכונה זו - ולא שהודעה היברידית מופחתת למשהו שניתן לבטא.

ההפך גם מחזיק וחשוב יותר: לקוח שולח היברידי רק כאשר הוא מחזיק במפתח, והחזקת המפתח היא הוכחה שהקבלן יכול לקפוץ.אין מצב שבו הודעה נשלחת פוסט קוונטית למישהו שאינו יכול לקרוא אותה.

6בנייה היברידית

Nymchat אינו מחליף את NIP-44.הוא מעוטר אותו.טקסט הצפנת NIP-44 ללא שינוי הוא שכבה הפנימית, ו-ML-KEM מפתח AEAD חיצוני סביב זה:

inner = nip44_encrypt(plaintext, conversation_key(sender, recipient))

info  = "nymchat-pq2" || sender_secp_pk || recip_secp_pk || kem_ct || recip_kem_pk
prk   = HKDF-Extract(salt = "nymchat-pq2-v1", IKM = kem_ss)
key   = HKDF-Expand(prk, info || "key",   32)
nonce = HKDF-Expand(prk, info || "nonce", 12)

outer = ChaCha20-Poly1305(key, nonce, plaintext = inner, aad = info)

payload = "pq2." || base64url(kem_ct) || "." || base64url(outer)

שני הסודות עדיין חייבים להתאושש כדי לקרוא את ההודעה: שכבה החיצונית מייצרת רק טקסט NIP-44 ומפתח זה זקוק לקלאסי ECDH. יריב קוונטי שמשבור את secp256k1 מקבל את המפתח הפנימי וממשיך להתמודד עם ML-KEM; שבר של ML-KEM מגרד את שכבת החיצונית ומשאיר את NIP-44 עומד.

המפתח ML-KEM של הנמען הוא בעל חיים ארוך, אבל כל הודעה נושאת טקסט הצפנה עצמאי ולכן עצמאי kem_ssזה מה שהופך את התוצאה של nonce במקום randomizing זה נשמע: צ'אצ'ה20-פולי1305 הוא נשבר על ידי שימוש חוזר זוג (מפתח, nonce), וכאן המפתח עצמו הוא חדש עבור כל הודעה, כך שאף זוג לא יכול לחזור.

6.1 מדוע שכבות נשארות נפרדות

האפשרות היא לערבב את שני הסודות למפתח שיחה אחד ולהעביר את זה ל- NIP-44:

ck = HKDF-Extract(salt = "…",
                  IKM  = ecdh_x || kem_ss || …)          // do not do this

הבנייה הזאת נשמעת כמו קריפטוגרפיה.יש לה בעיה מבנית אחת: היא צריכה ecdh_x, הקואורדינט האקראי של היציאה של ECDH, כחומר מפתח - והרחבת דפדפן (NIP-07) או חתימה מרחוק (NIP-46היא מבצעת את NIP-44 בשם המתקשר ומחזירה טקסט הצפנה, אשר הוא כל הנקודה של החזקת המפתח איפשהו היישום לא יכול להגיע.

שילוב הסודות, לפיכך, מבטל את כל ההתחברות שמחזיקה את מפתח הזהות בחתימה, כלומר את המשתמשים הקפדניים ביותר, ואין כמות של עבודה על הפרימיציה של המפתח יכולה לשנות אותה.השילוב מסיר את התמכרות: NIP-44 נשאר שלם והוא מיוצר על ידי כל מה שמחזיק במפתח הזהות, החתימה כוללת, בעוד שהחצית של KEM מחושבת מהקוד התאוששות שהלקוח מחזיק ישירות.

העלות היא רוחב פס, וזה לא קטן. ML-KEM הצפנת טקסט הוא 1,088 bytes ונוסע על כל הודעה, base64url-קודד 1,451 תווים; AEAD החיצוני מוסיף תגי Poly1305 16-byte ומרחיב את NIP-44 משקל הוא מכסה על ידי שליש. הודעה 50 תווים גדלה מ 176 bytes ל 1,712, ו 2,000 תווים אחד מ 2,820 ל 5,238.

6.2 תיאור עצמי של payloads

The pq2. הכותרת הופכת את ההתפשטות לאינטגרטיבית: היא מתארת את עצמה, כך שהלקוח בוחר את נתיב ההצפנה על-ידי בדיקת משקל המשמעותי ולא על-ידי אמון בתווית או זיכרון של מה שותף תומך.קורא שאינו מזהה את הכותרת נכשל לפתוח את משקל המשמעותי במקום לקרוא אותו לא נכון, והודעות סגורות לפני שני הצדדים יכלו להפוך את הפוסט קוונטי לקריא כמו NIP-44 רגיל ללא מעבר.

דחייה מעורפלת

ML-KEM decapsulation נועד לעולם לא להיכשל: בהינתן טקסט הצפנה מוטעה, הפונפורמציה של Fujisaki-Okamoto מחזירה סוד pseudo-לקריסטי ולא שגיאה. מפתח שגוי לא מופיע בשכבה של KEM בכלל – הוא מופיע ככישלון HMAC בתוך NIP-44, אשר באותו אופן שגוי משטחי מפתח קלאסיים. קוראים מתייחסים לשניהם באותו אופן, כך שהכישלון אינו נושא אות להבדיל.

6.3 שני שכבות של חבילת המתנה

A NIP-17 הודעה פרטית A NIP-59 חבילת מתנה: שמועה לא חתומה, סגורה תחת מפתח הזהות של השולח (סוג 13), ולאחר מכן מעוטרת תחת מפתח זורם שנוצר לכל הודעה (סוג 1059).

A hybrid NIP-59 gift wrap: the rumor sealed under the sender's key, that seal wrapped under a per-message ephemeral key, both layers carrying a NIP-44 ciphertext inside a post-quantum AEAD. kind 1059 — wrap  ·  signed by a per-message ephemeral key content = pq2.<kem_ct>.<aead>   inner = NIP-44(eph, recip)   outer key = ML-KEM(recip) kind 13 — seal  ·  signed by the sender's identity key content = pq2.<kem_ct>.<aead>   inner = NIP-44(sender, recip)   outer key = ML-KEM(recip) rumor — unsigned the message: kind, content, tags, author pubkey unsigned on purpose — a signature would be portable proof
שני שכבות ההצפנה היברידיות, כל אחת עם קפסולציה ML-KEM עצמאית. שכבת החיצונית מחוברת לסוד זורם, כך שהקליפה אינה חושפת את המפיץ.

החתימה מיוצרת על ידי החתימה כ- NIP-44 רגיל – היישום אף פעם לא רואה את המפתח שמבצע אותה – כך שהוא לא יכול להיות היברידיזציה במקום.

7הודעות קבוצתיות וקישור חלקי

הודעת קבוצה היא לא טקסט סיפרי אחד.זה אותו טקסט פשוט שפורסם לכל חבר, כל עותק מחובר למפתח ML-KEM של אותו חבר.חבר שפרסם מפתח מקבל חבילה היברידית; מי שלא מקבל חבילה קלאסית.

זה יוצר בעיה חשבונאית כי יישום נאיבי טועה.אם שמונה מתוך עשרה חברים מקבלים עותק היברידי, ההודעה היא לֹא יריב צריך עותק קלאסי אחד של טקסט פשוט זהה בכל עשר, כך שההודעה מוגנת רק אם כֹּל עותק זה

לכן, Nymchat עוקב אחר כיסוי לכל הודעה במהלך ה- fan-out - הספירה ידועה רק בזמן שההקלטות נוצרות - והדגל מדווחים על 8 מתוך 10 חברים, במקום לטעון שההודעה מוגנת. קבלה מסר קבוצתי (רק השולח מחשב את המעריץ), הממשק מדווח על הגנה חלקית ולא מלאה.

7.1 מה המגן מדווח

המגן אומר את האמת על מסרולא על התוכנה ששלחה אותו:

פסק הדין נרשם כאשר ההודעה מאובטחת ולא מחודשת ממה שמפרסמים עמיתים מאוחר יותר.קובץ סיפרות שכבר קיים לא יכול להיות מוגן טוב יותר מכפי שהיה, וממשק שחזר את ההודעות הישנות על כוחה של הודעה חדשה היה טוען משהו לא נכון לגבי בייטים על רייל.

הכללים של הקבוצה למעלה עולים על זה במקום להחליף אותו: הודעת קבוצה מוגנת לחלוטין רק כאשר העותק של כל חבר היה, והודעה של הקבוצה שהתקבלה ללא מספר כיסוי מופיעה חלקית.

8עותקים שנכתבו לעצמכם

מספר דברים שאוחסן לקוח מוצפנים לזהותו של המשתמש: הגדרות סינכרון, רשימת השיחות, מפתחות קבוצות וארכיון ההודעות. אלה נושאים יותר על המשתמש מאשר רוב ההודעות הבודדות, ולכן השאירו אותן קלאסיות יהפכו אותן לאגף הנשמר החלש ביותר, לא משנה כמה בזהירות נשלפו ההודעות עצמן. nymchat-pq-root סוג זה אינו יכול להיות סגור תחת מפתח שרק הוא יכול לייצר.

בלוב ההגדרות או שורה של ארכיון יושבים במקום אחד במשך שנים, וזה בדיוק הצורה של הדבר שאליו אוסף היריב - עכשיו-חוסך-אחר כך - הרבה יותר מכל הודעה יחידה, אשר היא לפחות אפמיאלית במוחו של המשתמש.

אחד המגבלות קובע את התבנית כאן ולא את המפתח. כֹּל כל מכשיר מפרסם את מה שהוא יכול לפתוח ברשימת ההודעה שלו, והחשבון כותב רק את מה שכולם יכולים לקרוא.

מחסום שווה לציין

מכשיר המכיל את הזהות, אך לא את השורש, אינו יכול לפתוח שום דבר סגורה למפתח השורש, כולל ההגדרות שלו.זהו תוצאה מכוונת, לא פיקוח, ולכן סעיף 3.3 מציע מכשיר מסוג זה כדי לקשר במקום לקשר שורש חדש: שורש שני לא יגרום לבלוב לקרוא, זה רק יפריד את החומר המפתח של הזהות לשניים.

מכשיר המופעל על ידי הרחבה של דפדפן או חתימה מרחוק (NIP-46) לא מחזיק nsec כדי להוביל, אבל הוא מחזיק את קוד ההחזרה, ובהתאם לבניית שכבות של סעיף 6.1 זה כל החצי הפוסט-קוונטי צריך: החתימה מייצרת את שכבת NIP-44 כפי שהיא תמיד יש, והלקוח מפתח את שכבת החיצונית עצמה.

9רוטציה

The epoch המספר בפירוטציה הוא מה שעושה סיבוב אפשרי ללא חומר מפתח חדש. הגדלתו מייצרת זוג מפתח חדש מאותו שורש ומודעה שפורסמה מחדש; עמיתים לוקחים את המפתח החדש מההקלטה המוחלפת.

9.1 התקופות הישנות נשמרות, ואין שום דבר מחדש מוצפן

לקוח בונה מועמדים לפתרון מהעידן הנוכחי למטה לעידן &minus; 3, כך הודעה סגורה זמן קצר לפני סיבוב עדיין נפתחת נגד זוג המפתחות שהיה נוכח כאשר הוא נשלח.

חלון זה הוא מה שהופך את הסיבוב בטוח לעשות בכלל: בלעדיו, כל סיבוב היה לפגוע כל מה שהיה בטיסה.כל דבר שכבר סגור נשאר קריא לכל החיים של הזהות, כי הודעה שהמשתמש כבר לא יכול לפתוח היא גרוע יותר עבורם מאשר אחד אשר הגנה לא ניתן לשפר באופן רטרוקטיבי (סעיף 10.5).

10מה זה לא מגן

נייר שמספר רק את מה שהעיצוב משיג אינו מתאר מערכת, והגזמה של תכונה אבטחה בממשק היא גרועה יותר מאשר הימנעות ממנה.

10.1 השורש הוא סוד שני, ואובדןו אינו ניתן להחזיר.

זהו המחיר האמיתי של העיצוב.הגבלת בסעיף 2 כי למשתמש צריך להיות בדיוק דבר אחד לשמור לא יכולה להתגשם: nsec לבדו לא מחדש את המפתח הפוסט-קוונטי, כי כל הנקודה היא כי אין ערך ציבורי ואין סוד אחר לחשוף אותו.אם אין מכשיר מחזיק את השורש ולא ניתן לפתוח אף אחד מהחבילות של סעיף 3.2, החומר המסומן למפתח השורש אינו ניתן להחזיר.

עם העברה ידנית הדרך היחידה, זה חריף יותר מאשר זה יכול לקרוא לראשונה. nympq1… לקוד בכל מקום יש בדיוק עותק אחד ממנו, במכשיר אחד, ואובדן המכשיר הזה מאבד כל הודעה פוסט קוונטית, הגדרות blob ושורה ארכיון סגורות אליו. nsec זה לא עוזר; זה הנכס שעליו מבוסס כל העיצוב.

תוקף תוקף את הנתיב הזול ביותר הזמין, כך שתוכנית שווה את שווי הנתיב החלש ביותר שלה - ביטוי בלתי נשכח, לדוגמה, יכניס את כל הדברים לכל מה שווה הביטוי, והשורה המעוטפת היא בדיוק האגף שהאויב מאוחר יותר אוסף ומרס מחוץ לאינטרנט בזמן הפנאי.

10.2 אימות, בניגוד לסודיות

כל חתימה ב-Nostr היא Schnorr מעל secp256k1, וזה לא השתנה כאן. יריב עם מחשב קוונטי יכול לכרות חתימות ולהתייחס למשתמש בזמן אמת. מה שהחלפת מפתח היברידית מפסידה הוא קציר-עכשיו-התגמול-אחר כך: תוקף שמקליט את התנועה היום לא יכול לקרוא את זה מאוחר יותר. זה לא עושה מסר בלתי נשכח נגד יריב שכבר יש את המכונה. ההבדל הזה מועבר ליישומים בכוונה - אינדיקטור הפדלוק מדווח על אימות, המגן מדווח על סודיות, והם גליפים נפרדים כי הודעה יכולה להיות אחת ללא השנייה.

הקשר בין מפתח npub לבין מפתח ML-KEM הוא חתימה secp256k1, כך שאויב שיכול להכליל אותם יכול להחליף מפתח משלו.

10.3 מטאדאיות

חבילת מתנה מסתירה את השולח, הקבלן מעבר לאחד. p התווית, הסוג והזמן של ההודעה הפנימית.היא אינה מסתירה את קיומו של אירוע, את גודלו, או מתי התקבלה על ידי רדיו.

10.4 ה-Offline Mesh

תחבורה ברשת Bluetooth של Nymchat היא פרוטוקול נפרד עם חיבוק יד משלו, והוא אינו מכוסה בעבודה זו.

10.5 הודעות שנשלחו

Ciphertext שנרשם בעוד שני הצדדים היו עדיין קלאסי נשאר קלאסי באופן קבוע. זה כבר קיים ולא ניתן לחתוך מחדש. הגנה מתחילה בהודעה שבה שני הצדדים החזיקו מפתחות פוסט קוונטי, לא ברגע התכונה נפתחה.

11חלופות שנחשבו

גישהלמה לא
להוציא את המפתח הפוסט קוונטי מפתח הזהות התשובה היא אלגוריתם ציבורי על ה- nsec, ואויב קוונטי מחזיר את ה- nsec מה- npub שפורסם, כך שבר את המחצית הקלאסית בידיים על המחצית הפוסט-קוונטית איתו.
שלח את השורש למכשירים אחרים של המשתמש באמצעות NIP-44 שורש שניתן להעביר תחת הצפנה קלאסית בלבד ניתן לשחזר על ידי כל מי שהקליט את ההודעה הזאת ושבר את המפתח שלה מאוחר יותר, שהוא היריב שורש קיים כדי לעצור.
זוג מפתחות ML-KEM שנוצר בנפרד על כל מכשיר מכשירים היו מחזיקים מפתחות decapsulation שונות, והודעה אחת להחליף לכל זהות לא יכול לשאת את כולם. שותפים היו להצפין לכל המפתח שפורסם לאחרונה, וכל מכשיר אחר לא היה מסוגל לקרוא את התוצאה.
להדביק את השורש תחת פין PIN בעל ארבעה ספרות הוא בסביבות 13 סיביות נגד תוקף לא מקוון שמחזיק בשורה מעוטרת.הצעה להציע אותו לצד שני מסלולי 256 סיביות תייצג לא נכון את ערך המעוטר החלש ביותר.
להרחיב את npub כדי לשאת את שני המפתחות 1,184 בייטים אינם מזהה משותף, וזה היה לשבור את כל מחקרי ה-Nostr הקיימים של כתובת המוגדרת כ- 32 בייטים.
שירות מנהל מפתח מציג מחדש את הסמכות שהרשת קיימת כדי להימנע.מי שמגיב על החיפוש מחליט מי יכול לקרוא את ההודעה.
הוסף את המפתח לכל הודעה לא פותר כלום: המשלוח צריך את הקבלן המפתח לפני ההודעה הראשונה, וזה בדיוק המקרה ללא הודעה קודמת לשאת אותו.
היכולת לנהל משא ומתן יוצר משטח הורד; תוקף שיכול להסיר דגל יכולות מחייב את המסלול הקלאסי.
Post-quantum בלבד, ללא רגליים קלאסיות דוחה עשרות שנים של ניתוח של secp256k1 בתמורה לפרימיטיבי צעיר הרבה יותר. שְׁנֵיהֶם הפסד

12Parity Implementation השוויון

Nymchat מספקת שתי יישומים עצמאיים של מבנה זה - אחד ב-JavaScript עבור יישום האינטרנט, אחד ב-Dart עבור יישומים ניידים, כולל יציאת ML-KEM-768.

יישום Dart ML-KEM מאושר נגד הרשמי NIST ACVP תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורות תגיות קשורותML-KEM-*-FIPS203) — 25 דגמי מפתח, 25 דגמי encapsulation ו-10 דגמי decapsulation, המופעלים כחבילת משלהם. אלה הם הווקטורים ש-NIST מפרסם כדי לאמת יישום, ולכן העברתם היא הוכחה שהפורט נכון, לא רק הוכחה לכך ששני הלקוחות מסכימים זה עם זה. יתר על כן, מחלוקת משותפת של וקטורים בדיקה – תוצרת זרעים, מקפוס, שני פורמטים של משאבים שימושיים וצירופי מתנות מלאים – נוצרת מהתייחסות JavaScript ונבדקת על ידי שתי מערכות הבדיקה. הסוד השורש מרחיב את זה במקום להחליף אותו: שורש לזרע, שורש ל- keypair, טביעת האצבע הציבורית של nympq1… דיוויגנציה בכל אחת מהיישומים נכשלת בביצוע במקום לייצר הודעה שהלקוח האחר לא יכול לפתוח.

זה מה שאומר מכשיר &ldquo;זהו השורש שאני מחזיק&rdquo; מ &ldquo;זה שונה, ולקוח שאינו יכול לשחזר את טביעת האצבע של לקוח אחר יהיה לקרוא רשומה טובה לחלוטין כמו שום רשומה בכלל - ולאחר מכן, בעקבות סעיף 3.3, לחתוך שורש שני לחלק את הזהות.

Nymchat הוא מקור פתוח על פי ה- AGPL-3.0, הליבה הקריפטוגרפית המתוארת כאן היא js/nym-crypto.js ו js/modules/pq.js באתר הלקוח, וכן lib/core/crypto/ עם lib/features/identity/pq_registry.dart עבור לקוחות ניידים.

עבור הסבר קצר יותר, לא טכני, ראה עמוד בסיס הידע על הצפנה עמיד לקוונטי.