Tags: , , , | Categories: Security Posted by talgiladi on 9/2/2007 9:38 PM | Comments (7)

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

DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();

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

DSAParameters privateKey = dsa.ExportParameters(true);

ואת הציבורי באותה צורה, אך מבלי להכליל את המידע הדרוש כדי לבצע חתימה:

DSAParameters publicKey = dsa.ExportParameters(false);

כעת נבצע את החתימה:

byte[] clearData = Encoding.UTF8.GetBytes(args[0]);
string signedData = Convert.ToBase64String(dsa.SignData(data, 0, data.Length));

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

קודם הוא יצור שוב מופע מהמחלקה שתוודא את החתימה, אך הוא יתן לה את המפתח הציבורי ששלחנו לו בתור פרמטר:

DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
dsa.ImportParameters(publicKey);

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

dsa.VerifyData(clearData, Convert.FromBase64String( signedData));

להורדת הפרוייקט

Technorati Tags: ,,,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5