חתימה עיוורת

בקריפטוגרפיה ואבטחת מידע, חֲתִימָה עִוֶּרֶת (באנגלית: Blind Signature) היא צורת חתימה דיגיטלית שבה תוכן המסר החתום מוסתר מפני החותם בזמן החתימה עליו. החתימה העיוורת ניתנת לאימות באופן פומבי מול המסר הגלוי באותו אופן שבו מבוצע אימות חתימה דיגיטלית רגילה למרות שהחותם לא היה מודע לתוכן המסר בעת החתימה. חתימה עיוורת שימושית במגוון תחומים בהם דרושה אנונימיות כמו הצבעה ממוחשבת או מסחר במטבע דיגיטלי.

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

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

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

==מבוא==

חתימה דיגיטלית היא תוצר של הצפנת מפתח ציבורי או הצפנה א-סימטרית שבה המערכת מפוצלת לשני חלקים נפרדים, שלב ההצפנה המקביל לשלב החתימה ושלב הפענוח המקביל לשלב אימות החתימה. כל אחד יכול לאמת חתימה המצורפת למסמך כלשהו באמצעות המפתח הציבורי של החותם אך רק החותם שמחזיק במפתח הפרטי יכול לחתום חתימה תקפה בשמו ובהגדרה אין אפשרות (או קשה מאוד) לנחש מהו מפתח החתימה הפרטי בידיעת מפתח האימות הציבורי. חתימה דיגיטלית כוללת פונקציית חתימה <math>S</math> ופונקציית אימות <math>V</math> כך שהתוצאה של <math>V(S(m))</math> על המסר <math>m</math> היא הוכחה לתקפותה. השיטה המפורסמת ביותר לחתימה דיגיטלית היא שיטת RSA המבוססת על העובדה שמצד אחד קל לבצע העלאה בחזקה ומצד שני קשה לפרק לגורמים מספרים שלמים. אליס בוחרת שני מספרים ראשוניים גדולים <math>p</math> ו-<math>q</math> ומחשבת את <math>n=pq</math>. כמו כן היא מגרילה מספר שלם <math>e</math> שהוא זר ל-<math>\phi(n)</math>, מחשבת את המפתח הסודי <math>d</math> כך שמתקיים <math>ed\equiv 1\text{ (mod }\phi(n))</math>. כאשר <math>\phi(n)</math> הוא פונקציית אוילר של <math>n</math> שהיא במקרה זה <math>(p-1)(q-1)</math>. את <math>e</math> ואת <math>n</math> היא מפרסמת לכל דורש ואילו את <math>d</math> ואת <math>p</math> ו-<math>q</math> היא שומרת בסוד. כדי לחתום על המסר <math>m</math> היא מחשבת את <math>s=m^d\text{ (mod }n)</math> אותו היא שולחת לבוב יחד עם המסר <math>m</math>. כדי לאמת את החתימה בוב מחשב את <math>m'=s^e\text{ (mod }n)</math> ורק אם מתקיים <math>m=m'</math> הוא מקבל את החתימה. זה נכון בשל הזהות הבאה:
<center>
:<math>s^d=(m^e)^d=m^{ed}=m^{1+\phi(n)k}\equiv m\text{ (mod }n)</math>
</center>
כי לפי אוילר <math>m^{\phi(n)}\equiv 1\text{ (mod }n)</math> עבור כל <math>m</math> ולכן גם <math>m^{1+\phi(n)}\equiv m\text{ (mod }n)</math>. היות שאף אחד חוץ מאליס אינו יודע מהם <math>d</math> או <math>\phi(n)</math> כיוון שהם מעולם לא פורסמו ולא ניתן לחשב אותם מתוך <math>e</math> ו-<math>n</math> מבלי לדעת מהם הגורמים הראשוניים, זהו מאפיין יסודי של הצפנה אסימטרית, לכן בוב יכול לקבל את החתימה כאותנטית. כמובן שהשיטה המתוארת נועדה רק להדגים את הקונספט של חתימה דיגיטלית, אין לראות בה בשום אופן שיטה מעשית לחתימה דיגיטלית. בפועל מיישמים חתימה דיגיטלית באופן אחר לגמרי כדי למנוע התקפות קריפטוגרפיות ידועות. אפשר לבסס חתימה דיגיטלית על מערכות הצפנת מפתח ציבורי אחרות כמו חתימה דיגיטלית של רבין המבוססת על הצפנת רבין או DSA המבוססת על הצפנת אל-גמאל.

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

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

אם מתרגמים את המושגים הללו לשפה קריפטוגרפית אז שלוש הדרישות הראשונות מקבילות לתהליך אימות קריפטוגרפי עם חתימה דיגיטלית קונבנציונלית. חתימת אליס היא <math>S_a</math> ופונקציית האימות הציבורית שלה היא <math>V_a</math> כך שמתקיים <math>V_a(S_a(M))=M</math>. שתי הדרישות האחרונות אומרות שהבוחר בוב צריך להצפין את פתק ההצבעה שלו באמצעות פונקציית הצפנה כזו כך שפתק ההצבעה ניתן יהיה לאימות גם במצבו הגלוי (לאחר פענוח). לשם המחשה נניח שפתק ההצבעה של בוב מסומן באות <math>B</math>, פונקציית ההצפנה שלו היא <math>E_b</math> ופונקציית הפענוח שלו היא <math>D_b</math> אז צריך שיתקיים <math>D_b(S_a(E_b(B)))=S_a(B)</math>. אפקטיבית, פעולת הפענוח של בוב מסירה את ההצפנה שלו על הפתק מבלי לפגוע בתקפות החתימה. קיימות מספר פונקציות הצפנה שמקיימות את הדרישה האמורה, אפשר למשל להשתמש ב-RSA, אך יש להיזהר ממלכודות, בדרך כלל משתמשים בהצפנת פליאיי. תהליך ההצבעה יבוצע כדלהלן:
# בוב מצפין את פתק ההצבעה שלו <math>E_b(B)</math> ושולח אותו מאומת לאליס (הם משתמשים בפרוטוקול אימות בנפרד מפרוטוקול זה).
# אליס מאמתת את זהותו של בוב וחותמת על פתק ההצבעה המוצפן <math>S_a(E_b(B))</math> ומחזירה אותו לבוב.
# בוב מפענח את המסר החתום שקיבל <math>D_b(S_a(E_b(B)))</math> ומקבל את <math>S_A(B)</math>. כדי למנוע מרמאי מלהחליף את פתק ההצבעה שלו במהלך המשלוח הוא מוודא שמתקיים <math>V_a(S_a(B))=B</math>.
# בוב שולח את פתק ההצבעה שלו <math>S_a(B)</math> לקלפי באופן אנונימי.
היות שפונקציית האימות של אליס ציבורית כל אחד יכול לחשב את <math>V_a(S_a(B))</math> ולוודא את אמינותו של פתק ההצבעה אך אף אחד לא יידע לשייך אותו לבוב כיוון שבוב שלח את הפתק באופן אנונימי. כדי למנוע הצבעה כפולה, חברי ועדת הקלפי צריכים לוודא שפתקי ההצבעה מכילים מרכיב אקראי שאליו מוצמדת ההצבעה כך שכל הצבעה עם <math>S_a(B)</math> תהיה שונה. בדרך זו אפשר להבטיח ספירה אמינה של הקולות ולזהות כפילויות. התרשים מצד שמאל ממחיש מערכת הצבעה דיגיטלית טיפוסית.

==מטבע דיגיטלי עם חתימה עיוורת==
בניגוד לרכישה באמצעות כרטיס אשראי או המחאה בנקאית, המאפיין המרכזי בכסף מזומן הוא שכאשר הלקוח מושך מזומנים מהבנק, הבנק אינו יודע איפה הלקוח מתכוון לבזבז אותם וכן כאשר הלקוח מבצע רכישה, הסוחר אינו יודע מי הוא הקונה. כך הכסף החליף ידיים מבלי שניתן יהיה להתחקות אחר הרוכש. אפשר לדמות מאפיין זה של רכישה במזומן גם בכסף דיגיטלי. לצורך המחשה נניח שאליס מייצרת מטבע דיגיטלי <math>C</math>. היא מחשבת את פונקציית הגיבוב של המטבע <math>f(C)</math> ואז מצפינה אותה באמצעות פונקציית ההצפנה שלה <math>E_a</math> עם המפתח הסודי <math>a</math>. את התוצאה <math>E_a(\ f(C)\ )</math> היא שולחת לבנק ומבקשת את אישורו. הבנק מזהה את הלקוחה באמצעי זיהוי רגילים ואז חותם על הגיבוב של המטבע באמצעות פונקציית החתימה שלו <math>S_b</math>, מחזיר לה את החתימה <math>S_b(\ E_a(\ f(C)\ )\ )</math> ומנכה את הסכום המתאים מחשבונה. כעת אליס מסירה את ההצפנה שלה מהמטבע על ידי חישוב <math>D_a(\ S_b(\ f(C)\ )\ )</math> ומתקבל <math>S_b(\ f(C)\ )</math>, כמו כן היא מוודא שמתקיים <math>V_b(\ S_b(\ f(C)\ )\ )=f(C)</math> כדי למנוע רמאות מצד גורם שלישי. כעת כדי לבזבז את המטבע היא משלמת עבור סחורה כלשהי עם <math>C</math> ועם <math>S_b(\ f(C)\ )</math>. הסוחר מוודא שהמטבע אותנטי ואושר על ידי הבנק על ידי בדיקה שמתקיים <math>V_b(\ S_b(\ f(C)\ )\ )=f(C)</math> כנדרש. פונקציית הגיבוב נחוצה כאן כדי למנוע מאליס מלרמות את הסוחר, כי ללא פונקציית הגיבוב אליס יכולה לבחור ערך אקראי כלשהו <math>X</math> ולמסור לו את (<math>X,V_b(X)</math>) כמטבע לגיטימי. כעת הסוחר שולח את המטבע <math>C</math> ואת החתימה <math>S_b(\ f(C)\ )</math> לבנק שמוודא שהמטבע תקף ואם כן הבנק מזכה את חשבונו של הסוחר בהתאם. כמו כן הבנק צריך לאחסן את <math>C</math> במקום כלשהו כמטבע שבוזבז כך שאליס לא תבזבז אותו שוב.

אפשר להדגים מטבע דיגיטלי עם פונקציית ההצפנה RSA. המטבע <math>C</math> בשווי דולר אחד יהיה מהצורה <math>C=(x,H(x)^{1/3}\text{ (mod }n))</math> כאשר <math>n</math> הוא מודולוס RSA של הבנק, <math>H</math> היא פונקציית גיבוב ו-<math>x</math> הוא ערך אקראי שנבחר על ידה. ביתר פירוט, פרוטוקול להנפקה ובזבוז של מטבע אחד מתנהל כדלהלן:
# אליס מגרילה שני שלמים אקראיים <math>x</math> ו-<math>r</math> ושולחת לבנק את המטבע המוסתר <math>B=(r^3\cdot H(x))\text{ (mod }n)</math>.
# הבנק מחזיר לה את השורש ממעלה שלישית של <math>B</math> מודולו <math>n</math> שהוא <math>(r\cdot H(x)^{1/3})\text{ (mod }n)</math> ומנכה מחשבונה דולר אחד.
# אליס מחלצת מתוך <math>B</math> את החתימה על המטבע <math>C</math> שהיא <math>H(x)^{1/3}\text{ (mod }n)</math>.
# אליס מבזבזת את המטבע, היא שולחת לבוב את הזוג <math>(x,H(x)^{1/3}\text{ (mod }n))</math>.
# בוב מתקשר לבנק מייד ומוודא שהמטבע לא בוזבז כבר. אם לא הוא בודק את חתימת הבנק ואת פונקציית הגיבוב.
# אם הבדיקות הצליחו הוא מקבל את המטבע ומספק את הסחורה או השרות תמורתו לאליס.
# הבנק מזכה את חשבונו של בוב בדולר אחד ורושם את המטבע כמי שכבר בוזבז, כדי למנוע בזבוז כפול.

===דוגמה במספרים קטנים===
יהיו <math>p=353, q=449</math> ו-<math>n=pq=158497</math>. מפתח האימות הציבורי של חתימת הבנק יהיה <math>3</math> ואילו מפתח החתימה הפרטי הוא <math>105131</math>. להכנת המטבע <math>C</math> 
*אליס בוחרת את <math>x=330</math> ואת <math>r=502</math> מחשבת את <math>H(330)=37</math> (במקרה זה הוגרל מספר כלשהו רק לצורך הדוגמה) ושולחת לבנק את <math>(25402\cdot 37)\equiv 147389\text{ (mod }158497)</math>. 
*הבנק מחזיר את חתימתו <math>147389^{105131}\equiv 67047\text{ (mod }158497)</math>. 
*אליס מפענחת את חתימת הבנק על ידי חילוק ב-<math>r</math> (ליתר דיוק הכפלה בהופכי הכפלי שלו מודולו <math>n</math>) ומתקבלת החתימה <math>(67047\cdot 37572)\equiv 97063\text{ (mod }158497)</math>. המטבע של אליס הוא <math>x=330</math> וחתימת הבנק על המטבע הגלוי היא <math>97063</math>.
*את הזוג <math>C=(330,97063)</math> היא שולחת לסוחר בוב. 
*הסוחר מצידו תחילה מוודא את תוקף המטבע על ידי בדיקת החתימה של הבנק (העלאה בחזקת 3) קל לראות שבמקרה זה מתקבל <math>97063^3\equiv 37\text{ (mod }158497)=H(x)</math>. כמו כן כדי למנוע רמאות מצד אליס הוא בודק שאכן מתקבל <math>H(330)=37</math>. אם שתי הבדיקות עלו בהצלחה הוא מספק את הסחורה או השרות לאליס ומפקיד את המטבע בבנק. 

כאשר הבנק חתם על <math>H(x)=37</math> הוא לא ראה אותו כיוון שהיה מוסתר בכפל ב-<math>r^3</math> לכן כאשר הסוחר מפקיד את המטבע, הבנק לא יודע שהמטבע התקבל מאליס.

==מטבע דיגיטלי עם הוכחה באפס ידיעה==

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

כמו בשיטה המתוארת לעיל הבנק בוחר תחילה מודולוס <math>n</math> ופרמטר ביטחון <math>k</math> שמגדיר את ההסתברות לתפוס מבזבז כפול. <math>k</math> גדול פירושו שקשה יותר לרמות וההסתברות שהרמאי יתגלה מתקרבת ל-1 די מהר ככל ש-<math>k</math> גדל. נניח שמספר החשבון של אליס הוא <math>u</math> עם מונה כלשהו <math>v</math>, כך שהבנק ואליס יודעים מהם. נניח שנתונות שתי פונקציות חד-כיווניות חסינות התנגשויות <math>f</math> ו-<math>g</math> שמפיקות פלט באורך קבוע (אפשר להשתמש ב-SHA-2 למשל). המטבע של אליס יהיה אחד מ-<math>k</math> הרביעיות <math>(a_i,c_i,d_i,r_i)</math> של מספרים שלמים מודולו <math>n</math> שהיא בוחרת באופן אקראי. רביעיות אלה נקראות "מועמדים". כדי להחתים את הבנק על המטבע היא מבצעת כדלהלן:
# היא מסתירה את <math>k</math> המועמדים באמצעות פונקציית ההצפנה שלה: <math>B_i=E_{r_i}(\ f(x_i,y_i)\ )</math> כאשר <math>x_i=g(a_i,c_i)</math> וכן <math>y_i=g(\ a_i\oplus (u\ \| \ (v+i)\ ),d_i)</math> ושולחת אותם לבנק. הסימן <math>\oplus</math> מייצג XOR והסימן <math>\|</math> מייצג שרשור מחרוזות.
# הבנק בוחר קבוצת אתגר אקראית <math>R</math> באורך <math>k/2</math> מועמדים מתוך הרשימה שקיבל ושולח אותה לאליס. אליס חושפת בפני הבנק את <math>(a_i,c_i,d_i,r_i)</math> עבור כל <math>i\in R</math>. הבנק בודק עבור כל רביעייה שמתקבל <math>B_i</math> כיוון שהוא יודע מהם <math>u</math> ו-<math>v</math>. לכן אם אליס מנסה לרמותו הסיכויים שהוא יגלה את הרמאות מאוד גבוהים.
# לאחר שנחה שדעתו של הבנק והוא משוכנע שאליס אינה רמאית הוא חותם על המטבע הממוסך <math>S_b(\Pi_{i\not\in R}B_i)</math> ומנכה את הסכום המתאים מחשבונה. הרעיון כאן הוא שהבנק צריך להחסיר מהחתימה את כל הערכים שאליס חשפה בשלב ההוכחה, כי הם אינם יכולים יותר לשמש כמטבע לגיטימי. הסימן <math>\Pi</math> היא פעולה כלשהי שהתכונה שלה היא שהיא נשמרת גם לאחר תהליך הפענוח של אליס. במאמר המקורי הפעולה הייתה כפל בגלל שסכמת החתימה הייתה חישוב שורש ממעלה שלישית וההצפנה של אליס הייתה כפל ב-<math>r^3_i</math>. כעת מפעילה אליס את פונקציית הפענוח שלה כדי לחשוף את הערך <math>C=S_b(\Pi_{i\not\in R} f(x_i,y_i))</math>, בודקת שהתוצאה נכונה על ידי הפעלת פונקציית האימות <math>V_b</math> ומקדמת את המונה <math>v=v+k</math>.

עבור <math>\epsilon</math> קבוע כלשהו, אם פחות מ-<math>(1-\epsilon)</math> מתוך <math>k</math> המועמדים המוסתרים <math>B_i</math> אינו במבנה הנכון <math>(\ E_{r_i}(f(g(a_i,c_i),g(a_i\oplus(u\| (v+i)),d_i)))\ )</math> (יש לזכור שהבנק יודע מהו <math>u\| (v+i)</math>), אז אליס תיתפס כמי שניסתה לרמות בהסתברות של <math>1-\exp(-c\epsilon k)</math>.

כעת בידי אליס מטבע דיגיטלי אותו היא יכולה לבזבז כדלהלן:
# היא שולחת את <math>C</math> לסוחר. 
# הסוחר שולח לאליס מחרוזת אתגר אקראית בינארית באורך <math>k/2</math> סיביות. אם הסיבית ה-<math>i</math> היא 1 אליס צריכה לשלוח לבוב את <math>a_i,c_i,y_i</math> ואם הסיבית ה-<math>i</math> היא 0 היא אמורה לשלוח את <math>x_i,a_i\oplus (u\ \| \ (v+i))</math> ואת <math>d_i</math>. הסוחר בודק שהערכים שקיבל תואמים את הערך של <math>C</math>. היות שההנחה היא שהפונקציות <math>f</math> ו-<math>g</math> בלתי הפיכות והחתימה של הבנק נחשבת אמינה, אם אליס מרמה בשלב זה היא תיתפס בהסתברות גבוהה.
# הסוחר שולח תעתיק של השיחה שלו עם אליס לבנק שמזכה אותו בסכום המתאים ושומר את תעתיק השיחה בקובץ לצורך תיעוד.

האנונימיות של אליס באינטראקציה שלה עם הסוחר נשמרת. המידע המזהה היחידי שהיא מסרה הוא מספר החשבון שלה כשהוא ממוסך עם ערך אקראי <math>a_i</math> לכן הסוחר אינו יכול לעשות בו כל שימוש. הערכים <math>c_i,d_i</math> נחוצים כך שגם אם יתגלה שהחד-כיווניות של הפונקציה <math>g</math> חלשה מהצפוי ומישהו הצליח לפצח אותה הוא יישאר עם מספר עצום של זוגות אפשריים <math>(a_i,c_i)</math> וכן <math>(a_i\oplus (u\ \|\ (v+i)),d_i)</math> שהפונקציה <math>g</math> ממפה לערכים <math>x_i,y_i</math>. כך שגם אם הסוחר מצליח להפוך את <math>g</math> הוא לא יצליח לחלץ מידע מועיל לגבי זהות אליס. אם אליס תנסה לבזבז את המטבע <math>C</math> שוב, יקרה דבר מעניין, הבנק ישווה את תעתיק השיחה מהרכישה החדשה עם התעתיק השמור מהרכישה הקודמת ובגלל שהאתגר אקראי יש סבירות גבוהה שיכול להיות אינדקס <math>i</math> כלשהו כך שסיבית האתגר ה-<math>i</math> הייתה 1 בעותק הראשון ו-0 בעותק השני כי שניהם אקראיים. לכן לא רק שהבנק יודע כעת שנעשה ניסיון לבזבוז כפול, אם הוא יבצע XOR של שני תעתיקי השיחות שבידו הוא יקבל את <math>u\ \|\ (v+i)</math>, שבעצם חושף את מספר חשבונה של אליס ואת זהותה.

הבעיה בשיטה זו היא שבעוד שהבנק מסוגל לגלות אם אליס ניסתה להונות אותו, הוא עצמו יכול להמציא תעתיק שיחה בדוי כדי להפליל אותה, לכן מעצם טענה זו הבנק לא יוכל לשכנע אף אחד אחר שאליס אכן רמאית (זוהי תכונה מהותית בהוכחה באפס ידיעה). אפשר לתקן את הבעיה על ידי הוספת חתימה דיגיטלית של אליס כדי להגן עליה מפני רמאות מצד הבנק. כאשר אליס בוחרת את המועמדים היא מגרילה <math>k</math> זוגות נוספים של ערכים <math>(p_i,q_i)</math> משרשרת אותם ביחד <math>g(p_1,q_1)\ \|\ \cdots\ \|\ g(p_k,q_k)</math>, חותמת על התוצאה ושולחת הכול לבנק. בנוסף כאשר היא מחשבת את<math> f(x_i,y_i)</math> היא מחליפה את <math>u</math> בביטוי <math>u\ \|\ p_i\ \|\ q_i</math>. ואז אם הבנק יכול לספק <math>k/2+1</math> זוגות נכונים <math>(p_i,q_i)</math> בידו ההוכחה שאליס ניסתה לרמות. אך התועלת כאן היא שהבנק אינו יכול לשנות את הערכים <math>g(p_i,q_i)</math> בגלל החתימה של אליס עליהם. גם אם נניח שהבנק מסוגל לפצח את <math>g</math> כל מה שאליס צריכה לעשות זה לחשוף את הזוג המתאים <math>(p_i,q_i)</math> שברשותה כדי להוכיח שנעשה ניסיון לרמותה.

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

==חתימה עיוורת מבוססת DSA==
חתימה דיגיטלית DSA וכן חתימה דיגיטלית של שנור מבוססים על הצפנת אל-גמאל שהיא מערכת מפתח ציבורי המבוססת על בעיית הלוגריתם הבדיד. פונקציית החתימה של שנור בגרסה הלא עיוורת פשוטה יותר מ-DSA והיא פועלת באופן כללי כדלהלן: בהינתן המפתח הציבורי <math>(p,q,g,y)</math> כאשר <math>(p,q,g)</math> הם פרמטרים ציבוריים המשותפים לכל המשתמשים. <math>p</math> ו-<math>q</math> הם מספרים ראשוניים מתארים תת-חבורה <math>\mathbb{Z}^*_q</math> של <math>\mathbb{Z}^*_p</math> מסדר <math>q</math> עם היוצר <math>g</math> כאשר <math>q|(p-1)</math>. המפתח הציבורי הוא <math>y=g^{-x}\text{ mod }p </math> ואילו המפתח הפרטי הוא <math>x</math>. אם <math>H</math> היא פונקציית גיבוב מוסכמת המפיקה פלט בטווח <math>[1,q-1]</math>, אז תהליך החתימה על המסר <math>m</math> מתבצע כך. החותם מגריל שלם אקראי <math>k</math> בטווח <math>[1,q-1]</math> ומחשב את <math>(r,e,s)</math> כדלהלן:
:<math>r=g^k\text{ mod }p</math>
:<math>e=H(m\ \|\ r)\text{ mod }q</math>
:<math>s=(k+xe)\text{ mod }q</math>
הסמל "<math>\|</math>" מייצג שרשור. לאימות החתימה באמצעות המפתח הציבורי של החותם בודקים שמתקיים:
:<math>r\equiv (g^s\cdot y^e)\text{ mod }p</math> או <math>e=H(m,(g^s\cdot y^e)\text{ mod }p)</math>.
כדי להפוך את החתימה המתוארת לחתימה עיוורת (נניח אליס מעוניינת להחתים את הבנק על המטבע <math>C</math>), מבצעים את הפרוטוקול של אוקמוטו המבוסס על שנור כדלהלן:
# הבנק בוחר את <math>k</math> כמו קודם ומייצר את <math>r=g^k\text{ mod }p</math> ושולח את <math>r</math> לאליס.
# אליס מגרילה שלמים אקראיים <math>a</math> ו-<math>b</math> בטווח <math>[1,q-1]</math> ומחשבת את <math>(r',e',e)</math> כדלהלן:
## <math>r'=(r\cdot g^{-a}\cdot y^{-b})\text{ mod }p</math>
## <math>e'=H(C\ \|\ r')\text{ mod }q</math>
## <math>e=(e'+b)\text{ mod }q</math>
## את הערכים הללו שולחת אליס לבנק.
# הבנק מחשב את <math>s=(k+ex)\text{ mod }q</math> ושולח לאליס את <math>s</math>.
# אליס מחשבת את <math>s'=(s-a)\text{ mod }q</math> והזוג <math>(e',s')</math> הם חתימה תקפה על <math>C</math>. כי מתקיים: <math>e'=H(m,(g^{s'}\cdot y^{e'})\text{ mod }p)</math>

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

הביטחון של חתימת שנור ניתן להוכחה במסגרת מודל אורקל אקראי תחת ההשערה שבעיית הלוגריתם הבדיד קשה. ב-2012 בוצע מחקר באשר לביטחון המדויק של חתימת שנור והטענה היא שלפי למת הפיצול קיים איבוד זמן בפקטור של <math>O(q_h)</math> כאשר <math>q_h</math> הוא מספר השאילתות לאורקל האקראי. במילים אחרות אם קיים זייפן שיכול לזייף חתימת שנור בהסתברות <math>\epsilon_F</math> אז אפשר יהיה לחשב את הלוגריתם הבדיד בהסתברות קבועה על ידי חזרה לאחור <math>O(q_h/\epsilon_F)</math> פעמים, תחת הנחות נוספות אפשר להגיע לרדוקציה של <math>q_h^{2/3}</math> לכל היותר בשיעור ההצלחה-זמן.

===דוגמה במספרים קטנים===
*נתון <math>q=179,p=359,g=164</math> וכן המפתח הפרטי של אליס הוא <math>x=81</math> והמפתח הציבורי הוא <math>y=245</math>. 
*הבנק בוחר שלם אקראי <math>k=45</math> ושולח לאליס את האתגר <math>r=164^{45}\equiv 120\text{ (mod }359)</math>. 
*אליס בוחרת את <math>a=64,b=120</math> ונניח שהמטבע הוא הערך <math>c=12345678</math>. היא מחשבת את <math>120\cdot 164^{-64}\cdot 245^{-120}\equiv 158\text{ (mod }359)</math>. נניח לצורך הפשטות שתוצאת הגיבוב היא <math>H(c\ \|\ 158)=54\text{ (mod }179)</math>. 
*הבנק מחזיר לאליס את <math>s=(45+174\cdot 81)\text{ mod }179=177</math> כך שמתקיים <math>120\equiv (174^{177}\cdot 245^{174})\text{ (mod }359)</math> 
*אליס מחלצת את חתימת הבנק על המטבע כך: תחילה <math>s'=177-64=113</math> ואז הצמד <math>(113,54)</math> הוא חתימה תקפה על <math>c</math> כי מתקיים <math>H(c\ \|\ ((164^{113}\cdot 245^{54}) =64\text{ mod }359))=54</math>

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

===פרוטוקול מטבע דיגיטלי עם חתימה עיוורת של ברנדס===
====פרוטוקול הכנה====
הבנק <math>\mathcal{B}</math> בוחר באקראי שלושה יוצרים <math>(g,g_1,g_2)</math> של החבורה <math>G_q</math> מסדר <math>q</math> ראשוני, שלם אקראי <math>x\in\mathbb{Z}_q^*</math> וכן שתי פונקציות גיבוב <math>H, H_0</math> כאשר <math>H</math> משמשת ליצירה ואימות חתימת הבנק ואילו <math>H_0</math> משמשת לצורך האתגר בפרוטוקול התשלום. הערכים הציבוריים המשותפים לכל הלקוחות הם <math>G_q</math> וכן הראשוניים <math>p</math> ו-<math>q</math> כאשר <math>G_q</math> היא תת-קבוצה של <math>\mathbb{Z}_p^*</math> וכן היוצרים ופונקציות הגיבוב. המפתח הסודי של הבנק הוא <math>x</math>. כרגיל ההנחה היא שהבנק מנהל מסד נתונים המכיל פרטים מזהים של כל הלקוחות וכל הסוחרים ובנפרד מסד נתונים המכיל מעקב אחרי כל המשיכות וההפקדות. מטבע דיגיטלי יכיל זוג הערכים <math>(A,B)\in G_q\times G_q</math> שבהמשך יוסבר איך מחשבים אותם והחתימה של הבנק עליהם <math>\text{sign}(A,B)=(z,a,b,r)</math> כך שמתקיים 
:<math>g^r=h^{H(A,B,z,a,b)}a</math>, וכן <math>A^r=z^{H(A,B,z,a,b)}b</math>.
ההוכחה שהמטבע שייך ללקוח היא אם הוא יכול להוכיח שידוע לו הייצוג הלוגריתמי של <math>A</math> ו-<math>B</math> ביחס ליוצרים <math>g_1</math> ו-<math>g_2</math>. בתהליך פתיחת חשבון הלקוח מזהה עצמו מול הבנק באמצעי זיהוי רגילים, מייצר ערך אקראי <math>u_1</math> ומחשב את <math>I=g_1^{u_1}</math> אם <math>g_1^{u_1}\cdot g_2\ne 1</math> הוא משדר את <math>I</math> לבנק ושומר בסוד את <math>u_1</math>. הבנק מחשב ומחזיר ללקוח את <math>z=(I\cdot g_2)^x</math>.

====פרוטוקול משיכה====
המשיכה מתבצעת בשלושה מהלכים, לאחר שהלקוח זיהה עצמו מול הבנק בדרכים רגילות:
#הבנק מגריל ערך אקראי <math>w</math> ושולח ללקוח את <math>a=g^w</math> ואת <math>b=(I\cdot g_2)^w</math>.
#הלקוח מייצר מטבע; בוחר שלושה ערכים אקראיים <math>(s,x_1,x_2)</math> ומחשב את <math>A=(I\cdot g_2)^s</math>, את <math>B=g_1^{x_1}g_2^{x_2}</math> וכן <math>z'=z^s</math>. כמו כן בוחר שני ערכים אקראיים נוספים <math>u,v</math> ומחשב את <math>a'=a^ug^v</math> וכן <math>b'=b^{su}A^v</math> ואז מחשב את האתגר <math>c'=H(A,B,z'a',b')</math> ושולח לבנק את <math>c=c'/u</math> מודולו <math>q</math>.
#הבנק מחזיר ללקוח תגובה המכילה את <math>r=cx+w</math> מודולו <math>q</math> ומחייב את חשבון הלקוח בהתאם.
הלקוח <math>\mathcal{U}</math> מקבל את חתימת הבנק רק אם מתקיים <math>g^r=h^ca</math> וכן <math>(I\cdot g_2)^r=z^cb</math>. אם כן הוא מחשב את <math>r'=ru+v</math> מודולו <math>q</math>.
בפרוטוקול זה מספר המטבעות לעולם לא יעבור את מספר המשיכות לכן הלקוח לא יכול לייצר לעצמו מטבעות במיוחד לאור העובדה שכדי להצליח בכך הוא חייב לדעת את הייצוג של המטבע ביחס ליוצרים שזו בעיה קשה הנגזרת מבעיית הלוגריתם הבדיד. וההוכחה דומה להוכחה של פרוטוקול האימות של שנור. תכונה מעניינת נוספת היא שהפרוטוקול נחשב לחתימה עיוורת חלקית כי הלקוח יכול להסתיר את המעטפת החיצונית של המטבע אבל לא את המבנה הפנימי שלו.

====פרוטוקול בזבוז====
כאשר <math>\mathcal{U}</math> רוצה לבזבז את המטבע אצל <math>\mathcal{S}</math> הוא מבצע כדלהלן:
#שולח לסוחר את המטבע <math>\langle (A,B), \text{sign}(A,B)\rangle</math>.
#הסוחר מחשב את <math>d=H_0(A\ \|\ B\ \|\ ID)</math> כאשר <math>ID</math> מכיל פרטים מזהים של הסוחר כמו גם תאריך העסקה.
#הלקוח מחשב ושולח ל-<math>\mathcal{S}</math> את המענה <math>r_1=d(u_1s)+x_1</math> ואת <math>r_2=ds+x_2</math> (מודולו <math>q</math>).

הסוחר מקבל את המטבע כלגיטימי רק אם שני הדברים הבאים מתקיימים: החתימה של הבנק תקפה וכן שמתקיים <math>g_1^{r_1}g_2^{r_2}=A^dB</math>.
אם הלקוח יודע את פרטי הסוחר מראש אפשר לצמצם את פרוטוקול התשלום למהלך אחד שכן הוא יכול לחשב את <math>d</math> לבדו. ברור שנכונות <math>d</math> חשובה לסוחר ולא ללקוח כי תקפותו תקבע אם הבנק יכבד את העסקה ויזכה את הסוחר בהתאם.

====פרוטוקול הפקדה====
הסוחר יכול לאחר מכן לשלוח לבנק את תעתיק העסקה הכולל את <math>A,B,\text{sign}(A,B),(r_1,r_2)</math> וכן התאריך הכלול בה. הבנק לא יכבד את העסקה אם <math>A=1</math>, אחרת הוא מחשב את <math>d</math> בעזרת זהותו של הסוחר הרשומה במסד הנתונים של הבנק ותעתיק העסקה. ומוודא שמתקיים <math>g_1^{r_1}g_2^{r_2}=A^dB</math> וכן שהחתימה שלו על המטבע תקפה ואם הבדיקות עלו בהצלחה הוא מפקיד את המטבע בחשבונו של הסוחר. אם המטבע כבר רשומה במאגרי הבנק משמע אחד מהשניים או ש-<math>\mathcal{S}</math> מנסה להפקיד את אותה מטבע פעמיים או שנעשה ניסיון לבזבוז כפול מצד <math>\mathcal{U}</math>. קל לזהות את המקרה שהסוחר מנסה להפקיד את אותה מטבע פעמיים כי תעתיק העסקה זהה לחלוטין. במקרה שתעתיק העסקה שונה הבנק יכול לחשוף את זהות <math>\mathcal{U}</math> כי בידיו כעת <math>(d,r_1,r_2)</math> מהעסקה החדשה וכן <math>(d',r_1',r_2')</math> מעסקה קודמת. הוא יכול לחשב את <math>g_1^{(r_1-r_1')/(r_2-r_2')}</math>. התוצאה היא למעשה מספר החשבון של הלקוח שניסה לבזבז את המטבע פעמיים והוא מהווה הוכחה לכך.

==הערות שוליים==

קטגוריה:חתימה דיגיטלית