שידור מוצפן
Subset Cover

הבסיס התאורטי למשפחת האלגוריתמים Subset-Cover מתחיל במושג שהגו לראשונה פיאט ונאור שנקרא סכימת ביטול "k-resilient" הפועלת כך שבהינתן קבוצה  U של  n חברים, הסכימה תהיה עמידה כנגד קואליציה  S של עד  k חברים. לשם כך מקצים מפתחות הצפנה סודיים ונפרדים  K_{B} עבור כל תת-קבוצה  B\subset U אפשרית כאשר  0\leq |B|\leq k, אותו מעבירים לכל משתמש  u\in U-B (לכל המשתמשים החברים ב- U אך אינם נמנים עם  B). אפשר לדמות זאת באנלוגיה למצב שבו המפתחות נרשמים על גבי מצחם של כל המשתמשים, כל אחד יכול לראות את המפתחות של כולם למעט המפתח הרשום על מצחו. אם הקבוצה  T היא אוסף חברים מורשים, מפתח ההצפנה הסודי עבורם הוא XOR של כל המפתחות  K_{B} כאשר  B\subset U-T. כל קואליציה של  S\leq k חברים תחסר את המפתח  K_{S} (המשויך להם) ולכן לא תוכל לחלץ את המפתח של  T בתנאי שמתקיים  S\cap T=\emptyset .
הסכימה המתוארת הוכחה בטוחה מהיבט תאורטי אך אינה יעילה, כדי לכסות את כל האפשרויות, כל משתמש נדרש לאחסן  \textstyle \sum _{i=0}^{k}{\binom {n}{k}} מפתחות (לדוגמה; עבור עשרה משתמשים שמתוכם חמישה מבוטלים, כל משתמש נדרש לאחסן 638 מפתחות). במקרה הפרטי שבו  k=1 (כלומר רק משתמש אחד מבוטל) מספר המפתחות שכל אחד נדרש לשמור הוא  n+1. אפשר לשפר את הסכימה על ידי הסתמכות על פונקציה חד-כיוונית ואז הביטחון אינו אבסולוטי אלא חישובי. מדמים את רשימת המשתמשים לעץ בינארי שכל עלה בו מתאים למשתמש אחד. מקצים מפתח אקראי לשורש העץ ולכל צומת מקצים רקורסיבית מפתח מתאים על ידי פונקציה פסאודו-אקראית  f:\{0,1\}^{\ell }\mapsto \{0,1\}^{2\ell } שמקבלת קלט מפתח של צומת אב ומפיקה פלט כפול באורכו, מחצית אחת מקצים לבן השמאלי והמחצית השנייה לבן הימני. היתרון שבשיטת בנייה זו הוא שכעת כל משתמש נדרש לדעת בעיקרון רק מפתח של אב קדום כלשהו שלו, כי המפתח שלו הוא תוצאה של הפעלת הפונקציה הפסאודו-אקראית באופן רקורסיבי במסלול מהשורש ועד לעלה שלו. כעת כדי לבטל עלים מסוימים מסירים את המסלולים המקשרים ביניהם לבין שורש העץ, כך למעשה נוצר "יער" של  \lceil {\text{log }}n\rceil  תת-עצים, כל משתמש צריך לקבל כעת את מפתחות של כל שורשי תת-העצים. כעת אם המדיה מוצפנת עם XOR של כל המפתחות המשויכים למשתמשים שהוסרו, כל משתמש  x יכול לחשב כל מפתח מלבד המפתח המשויך אליו ולכן אינו יכול לחלץ את המפתח לתוכן. המשתמשים המורשים לעומת זאת מקבלים את המפתח כשהוא מוצפן עם המפתח הפרטי שהם משתפים עם השרת.
דרך אחרת היא לבסס את הסכימה על בעיה מתורת המספרים דוגמת RSA. השרת מכין מפתח שורש שהוא  n=pq, כפולה של שני ראשוניים גדולים, בוחר יוצר  g מסדר גבוה וכל משתמש  i מקבל את  g_{i}=g^{p_{i}} כאשר כל  p_{i} זרים הדדית. המפתח המשותף לקבוצה  T הוא  g_{T}=g^{p_{T}}{\text{ mod }}n כאשר  \textstyle p_{T}=\prod _{i\in T}p_{i} ואז המשתמש  i מחלץ את המפתח המשותף על ידי  \textstyle g_{T}=g_{i}^{\prod _{j\in T-\{i\}}p_{j}}{\text{ mod }}n כלומר חזקה של כל המפתחות למעט המפתח שלו. הוכח שהסכימה הזו בטוחה בהנחה שפירוק לגורמים היא בעיה קשה וכל מה שנדרש לאחסן הוא רק מפתח אחד.
בשתי הסכימות השרת אינו נדרש לשדר כלל מידע נלווה לתוכן המוצפן, כיוון שהמפתחות הוקצו מראש ובידי המשתמשים המידע הדרוש לחילוץ מפתח השיחה. אולם שיתוף פעולה של שני משתמשים מאפשר להם לשבור בקלות את המערכת. אלגוריתם Complete Subset Cover מרחיב את הרעיון הבסיסי לעמידות כנגד  k>1 מבוטלים וכן מצמצם את דרישות האחסון ברמת משתמש במחיר שהשרת ישדר לפני כל תוכן מוצפן מידע מסוים שנקרא "כותר". בכללות הוא מגדיר אוסף של תת-קבוצות  S_{1},...,S_{w} כאשר  S_{j}\subseteq {\mathcal {N}}. מקצים מפתח סודי ארוך טווח (קבוע)  L_{j} לכל  S_{j} ולכל  u\in S_{j} מקצים מידע פרטי  I_{u} איתו הוא אמור לשחזר את  L_{j}. בהינתן קבוצה  {\mathcal {R}} של משתמשים מבוטלים יתר המשתמשים  {\mathcal {N}}\setminus {\mathcal {R}} מחולקים לתת-קבוצות זרות  S_{i_{1}},...,S_{i_{m}} כך שמתקיים:
K מוצפן  m פעמים עם המפתחות  L_{i_{1}},...,L_{i_{m}} בהתאמה.
לצורך כך יש להגדיר שני פרימיטיבים קריפטוגרפיים: (1) צופן מהצורה  F_{K}:\{0,1\}^{*}\mapsto \{0,1\}^{*} להצפנת התוכן  M עם  K שצריך להיות חדש עבור כל תוכן. הצופן צריך להיות מהיר ולא אמור לגרום להתנפחות התוכן עקב ההצפנה. הוא יכול להיות צופן זרם בטוח כמו Salsa20. וכן (2) צופן מהצורה  E_{L}\{0,1\}^{\ell }\mapsto \{0,1\}^{\ell } עם מפתח ארוך-טווח  L שהמרכז משתף עם כל משתמש בנפרד. יכול להיות צופן בלוקים כמו AES. מסיבות של יעילות רצוי ש- K יהיה קצר (להגנה על זכויות יוצרים אין צורך בהצפנה כבדה) ורק המפתח ארוך הטווח צריך להיות באורך מלא (בדרך כלל 128 סיביות). מפני שאורך הכותר תלוי בגודל הבלוק של צופן הבלוקים, אפשר להשתמש בחלופה חסכונית כך;  [{\text{Prefix}}_{|K|}E_{L}({\mathcal {U}})]\oplus K במקום בלוק מלא. כאשר הביטוי  {\text{Prefix}}_{i}(S) פירושו  i הסיביות הראשונות של הערך  S וכן  {\mathcal {U}} הוא מחרוזת אקראית כלשהי באורך בלוק מלא.