בדף הזה מתואר הפורמט של חוט Tink למפתחות ולפלט פרימיטיבי. מיועד לקריפטוגרפים שרוצים להוסיף שפות Tink ומתחזקים של ספריות קריפטו אחרות ברמה גבוהה שרוצים חוט במצב תאימות. הוא לא מיועד לקהל הרחב.
סריאליזציה של ערכות מפתחות
Tink משתמש ב-protobuf של Google כדי ליצור סריאליזציה לערכות המפתחות שלו.
- קבוצת מפתחות בינארית עם סריאליזציה היא פרוטו של קבוצת מפתחות סריאלית שמוגדר ב- tink.proto. מאפיין הערך KeyData של מפתח הוא סריאלי ב-proto של סוג המפתח התואם.
- מערך מפתחות עם סריאליזציה ל-JSON הוא אב טורי של קבוצת מפתחות בפורמט JSON. שימו לב שהערך של KeyData הוא עדיין אב טורי בינארי.
- מערך מפתחות מוצפן הוא Proto EncryptedKeyst בפורמט טורי מוגדר ב- tink.proto. הוא מכיל קבוצת מפתחות בינארית עם הצפנה טורית מוצפנת ואופציונלי, מטא-נתונים לא מוצפנים של KeysetInfo.
קידומת פלט Tink
רוב הפרימיטיביים ב-Tink תומכים בקידומת פלט של 5 בייטים, הכוללת:
- גרסה בבייט אחד:
0x01
- רמז למפתח עם 4 בייטים: זה מזהה המפתח של המפתח שנעשה בו שימוש.
חלק מהמפתחות מהדור הקודם עשויים גם לתמוך בגרסה בבייט 0x00
.
שימו לב שהקידומת הזו לא מאומתת ולא ניתן להסתמך עליה מטעמי אבטחה למטרות. ב-Tink, המערכת משתמשת בו כרמז להאצה של פענוח או אימות.
AEAD
באופן כללי, Tink מעצב מידע מוצפן (ciphertexts) מסוג D כך:
prefix || IV || ciphertext || tag
אלא אם צוין אחרת ב-RFC המתאים. השדה prefix
ריק
או קידומת של פלט Tink בגודל 5 בייטים.
AES-CTR-HMAC
בשביל AES-CTR-HMAC, Tink מחשב את ה-MAC עם נתונים משויכים (AD) באופן הבא:
AD || IV || ciphertext || bitlen(AD)
bitlen(AD)
הוא אורך ה-AD בביטים שמיוצגים כ-Big-endian של 64 ביט
מספר שלם לא חתום. סכימת ה-HMAC הזו עוקבת אחר הטיוטה עבור AES-CBC-HMAC של
Mcgrew.
דטרמיניסטי D
Tink מיישם את RFC 5297 ל-AES-SIV, מהו וקטור האתחול (SIV) בתחילת הטקסט המוצפן. רכיב זה עשוי להוסיף קידומת פלט Tink של 5 בייטים.
RFC 5297 תומך ברשימה של נתונים משויכים, אבל ב-Tink יש תמיכה מדויקת בלבד. נתון משויך אחד, שתואם לרשימה עם רכיב אחד ב-RFC 5297. נתונים משויכים ריקים הם רשימה עם רכיב ריק אחד, ולא פריט ריק חדשה.
סטרימינג של AEAD
ראו AES-CTR HMAC וב- AES-GCM-HKDF.
הצפנת מעטפות
הצפנת מעטפת מצפינה את הנתונים עם מפתח להצפנת נתונים DEK
באמצעות
עקרונות ה-D של Tink. ההצפנה פועלת באופן הבא:
- השדה
DEK
החדש נוצר באמצעות תבנית מפתח נתונה (או פרמטרים מרכזיים מסוימים). - הערך של
DEK
עובר סריאליזציה למחרוזת של בייטים. בפורמט הסדרתי סריאליזציה של מאגר נתונים זמני בפרוטוקול ב-Proto של סוג המפתח. לדוגמה, זו הנחיה הודעה מאגר נתונים זמני של פרוטוקולAesGcmKey
סריאלית מוגדרת ב aes_gcm.proto ל-DEK מסוג מפתח AES GCM. במאמר סריאליזציה של מאגר הנתונים הזמני של הפרוטוקולים מוסבר איך לעשות זאת בסדרה מאגר נתונים זמני לפרוטוקול. - המספר הסידורי
DEK
מוצפן על ידי ספק חיצוני (לדוגמה, GCP), לencrypted DEK
. - השדה
DEK
משמש להצפנת הטקסט ללא הצפנה עם הנתונים המשויכיםciphertext
. כלומר, הפורמט שלciphertext
זהה לפורמט של רכיב ה-AEAD שתואם ל-DEK
.
פורמט הפלט של הצפנת המעטפה הוא:
encrypted DEK length || encrypted DEK || ciphertext
הערך של encrypted DEK length
הוא 4 בייטים, והאורך של encrypted DEK
מאוחסן
בתור מספר שלם Big Endian ב-32 ביט.
MAC
קוד ה-Tink תואם ל-RFCs התואמים. משתמשים ראשיים עשויים להוסיף פלט Tink של 5 בייטים בקידומת לתג.
הגדרת PRF
קוד ה-Tink תואם ל-RFCs התואמים. שימו לב שעבור PRF, סוג המפתח שונה מסוג מפתח MAC של אותו אלגוריתם, על ידי אי הכללת אורך הפלט. מקשי PRF Set אף פעם לא מוסיפים קידומת לפלט Tink. כך מוודאים שהפלט PRF.
הצפנה היברידית
הפורמט הכללי של חוטים להצפנה היברידית ב-Tink הוא:
prefix || encapsulated_key || encrypted_data
השדה prefix
ריק או שהוא מתחיל בקידומת פלט של Tink בגודל 5 בייטים. כל סוג מפתח מכיל
מידע על מספר הבייטים לנתח, וכיצד לנתח את הבייטים האלה
encapsulated_key
HPKE (הצפנת מפתחות ציבוריים היברידית)
Tink תואם לתקן HPKE שמוגדר ב-RFC 9180. הצפנת הצפנה של HPKE כוללת את שלושת האלמנטים הבסיסיים הבאים.
- מנגנון הצפנת מפתחות (KEM)
- פונקציית גזירה של מפתחות (KDF)
- הצפנה מאומתת עם נתונים משויכים (AEAD)
תקן HPKE לא מגדיר פורמט חוטים כללי ב-RFC 9180, סעיף
10. בהטמעת HPKE של Tink נעשה שימוש בשיטות הבאות
encapsulated_key
ו-encrypted_data
.
encapsulated_key
- המפתח הציבורי הסידורי של השולח
- מוגדר כ-
enc
ב- RFC 9180, סעיף 4.1 - הפורמט נקבע על סמך ה-HPKE KEM הספציפי שבו נעשה שימוש
encrypted_data
- מידע מוצפן (ciphertext) ותג (למשל,
ciphertext || tag
בלי העירוב) - מוגדר כ-
ct
ב- RFC 9180, סעיף 4 - הפורמט שנקבע על ידי ה-HPKE AEAD הספציפי שבו נעשה שימוש
- מידע מוצפן (ciphertext) ותג (למשל,
KEM מבוסס X25519 Diffie-Hellman
למעבדי X25519 DHKEM, הערך enc
הוא Diffie-Hellman ציבורי בגודל 32 בייטים של השולח
מקש.
ECIES-AEAD-HKDF
בהטמעה של ECIES-AEAD-HKDF של Tink, הערך encapsulated_key
הוא הפלט
של מנגנון אנקפסולציית המפתחות (KEM) ו-encrypted_data
הוא הפלט
של מנגנון אנקפסולציית הנתונים (DEM).
KEM
בהתאם לסוג המפתח, Tink משתמש בעקומה אליפטית דחוסה ולא דחוסה
לפי תקני הקידוד RFC 8422/ANSI.X9-62.2005
. עבור
נקודות לא דחוסות, הבייט 0x04
ואחריו x
ו-y
יוצרים קואורדינטות כמספרים שלמים בגודל קבוע. לקואורדינטות דחוסות, הבייט 0x02
או 0x03
והמערכת משתמשת בקואורדינטה x
כמספר שלם קבוע. של X25519
,
המערכת משתמשת בהגדרה של RFC 7748 (קואורדינטה x
כמספר שלם קבוע).
מִפְתח DEM
ב-encrypted_data
, Tink משתמש בפורמט זהה לזה של AEAD. המידע הזה כולל
שמציין מהו IV.
נגזרת מפתח
תחילה מחושבת קואורדינטת ה-x x_ss
של הנקודה המשותפת. המפתח עבור
הגדרת AEAD היא:
HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)
כאשר encapsulated_key
הוא פלט ה-KEM המלא כבייטים.
חתימות דיגיטליות
קוד ה-Tink תואם ל-RFCs התואמים. משתמשים ראשיים עשויים להוסיף פלט Tink של 5 בייטים קידומת לתג שנוצר.
ECDSA
בהתאם לשדה EcdsaSignatureEncoding במפתח,
הפורמט של חתימת ECDSA הוא IEEE P1363
או ASN.1 DER
.
הפורמט של החתימה IEEE P1363
הוא r || s
, כאשר r
ו-s
הם
הם ללא משטח, והגודל שלהם זהה בבייטים לסדר העקומה. עבור
לדוגמה, בעקומה NIST P-256
, r
ו-s
נוספים אפס ל-32 בייטים.
חתימת ה-DER מקודדת באמצעות ASN.1
:
ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }
באופן ספציפי, הקידוד הוא:
0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s
Tink פועל בהתאם לשיטות המומלצות לאימות חתימה, בכך שהוא מאשר רק חתימות ECDSA בקידוד DER (חתימות חלופיות בקידוד BER לא תקינות).
כך ניתן למנוע התקפות של יכולת ועליות חתימה, שבדרך כלל משפיעה במערכות של מטבעות וירטואליים.