סטרימינג של הצפנה מאומתת עם נתונים משויכים (Streaming AEAD)

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

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

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

הטמעות של AEAD בסטרימינג עומדות בהגדרה של AEAD ובטוחות לפי nOAE. הם כוללים את המאפיינים הבאים:

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

נתונים משויכים

אפשר להשתמש ב-AEAD בסטרימינג כדי לקשר טקסט מוצפן לנתונים משויכים ספציפיים. נניח שיש לכם מסד נתונים עם השדות user-id ו-encrypted-medical-history. בתרחיש הזה, אפשר להשתמש ב-user-id כנתונים משויכים כשמצפינים את encrypted-medical-history. כך תוקפים לא יכולים להעביר את ההיסטוריה הרפואית ממשתמש אחד למשתמש אחר.

בחירת סוג מפתח

מומלץ להשתמש ב-AES128_GCM_HKDF_1MB ברוב השימושים. באופן כללי:

  • AES128_GCM_HKDF_1MB (או AES256_GCM_HKDF_1MB) היא האפשרות המהירה יותר. הוא יכול להצפין 264 קבצים בגודל של עד 264 בייטים כל אחד. בתהליך ההצפנה והפענוח נצרך נפח זיכרון של כ-1MB.
  • האפשרות AES128_GCM_HKDF_4KB צורכת כ-4KB של זיכרון, והיא בחירה טובה אם למערכת שלכם אין הרבה זיכרון.
  • אפשרות AES128_CTR_HMAC_SHA256_1MB (או AES256_CTR_HMAC_SHA256_1MB) היא שמרנית יותר.

התחייבויות אבטחה

הטמעות של AEAD בסטרימינג מציעות:

  • אבטחה מסוג CCA2.
  • חוזק אימות של 80 ביט לפחות.
  • היכולת להצפין לפחות 264 הודעות3 באורך כולל של 251 בייטים2 . לאף התקפה עם עד 232 טקסטים רגילים או טקסטים מוצפנים שנבחרו, אין סיכוי הצלחה גדול מ-2-32.

תרחיש לדוגמה

אני רוצה להצפין קבצים גדולים או מקורות נתונים


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

  2. יש תמיכה ב-232 פלחים, כאשר כל פלח מכיל segment_size - tag_size בייטים של טקסט ללא הצפנה. בקטעים של 1MB, הגודל הכולל של הטקסט ללא הצפנה הוא 232 * (220-16) ~= 251 בייטים. 

  3. הצפנה זרימה של AEAD הופכת ללא מאובטחת כשיש חזרה על שילוב של מפתח נגזר (128 ביט) וקידומת של nonce (ערך אקראי עצמאי באורך 7 בייטים). יש לנו עמידות בהתנגשויות של 184 סיביות, שמתרגמת בערך ל-264 הודעות אם אנחנו רוצים שסיכוי ההצלחה יהיה קטן מ-2-32