חתימה דיגיטלית
חתימה דיגיטלית
חתימה דיגיטילית זה בעצם שילוב של מפתח ציבורי/פרטי עם האש. אני רוצה להשיג 2 מטרות בבת אחת- גם לוודא שהמכתב שהנמען קורא הוא המכתב שאני כתבתי והמידע בו לא השתנה, וגם שזהו אכן מכתב שאני כתבתי ולא מישהו אחר. כדי להשיג את המטרה הראשונה, אנחנו משתמשים בהאש – כך אנו מוודאים שהמידע במכתב לא השתנה, והמטרה השניה מושגת על ידי שימוש בהצפנה על ידי המפתח הפרטי שלי- אבל הצפנה רק של ערך ההאש, לא של המכתב כולו.
ועכשיו לקצת קוד:
using System.Security.Cryptography;
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
* ניתן באופן זהה במחלקה RSACryptoServiceProvider ושם ניתן גם לציין את האלגוריתם לביצוע ההאש.
המחלקה הזאת תבצע בעצם את פעולת ההאש והחתימה ביחד. אם כבר יש לי מפתח פרטי אזי נאתחל את המחלקה איתו:
dsa.FromXmlString(privatekey);
אם לא אז המחלקה תיצור באופן אוטומטי זוג מפתחות. זיכרו שאנחנו אמורים לספק לצד שמקבל את המידע את המפתח הציבורי שלנו כדי שיוכל לוודא איתו את החתימה, אז אם אין לי עדיין מפתח ציבורי נקבל עכשיו אחד חדש:
string publickey=dsa.ToXmlString(false);
זהו בעצם, עכשיו פשוט נייצר את החתימה:
byte[] signature = dsa.SignData(mydata);
וניתן להפוך לסטרינג כמובן:
string result=Convert.ToBase64String(signature);
עכשיו אנחנו מפרסמים את המידע שכתבנו, את המפתח הציבורי ואת החתימה. הצד השני יבצע את הפעולות הבאות כדי לוודא שהחתימה מתאימה:
1. ניצור אובייקט מהמחלקה המתאימה:
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
2. ניתן לו את המפתח הציבורי שקיבלנו:
dsa.FromXmlString(publickey);
3. וכעת ניתן לו את המידע עצמו ואת החתימה ונקבל ערך בוליאני האם החתימה מתאימה או לא:
bool match=dsa.VerifySignature(data, signature);
וזהו...
להורדת קבצי המקור והפרוייקט