הצפנה סימטרית ב .NET
קודם כל DES הוא באמת לא האלגוריתם המומלץ. אני הייתי ממליץ על Rijndael קודם כל זה אלגוריתם חזק הרבה יותר וחוץ מזה הוא לא תלוי ב win32CryptoAPI מה שבעיני הוא ייתרון בעקבות כל הגילויים שהיו על מפתחות ג'נרים. אבל בלי אידיאולוגיה זה המפתח החזק ביותר הזמין היום כחלק מה Cryptography namespace. הדרך הכי נוחה לעבודה היא עם אובייקט CryptoStream הנה דוגמת קוד פשוטה מאוד לשימוש בו, אני אשמח לתת לך דוגמת קוד מתוחכמת יותר אם תגיד לי למה אתה משתמש בזה (מה אתה מצפין ומה את עושה עם זה, מעביר ברשת, שומר לקובץ או ל DB וכו')
string data = "very very secret stuff"; RijndaelManaged crypt = new RijndaelManaged(); MemoryStream ms = new MemoryStream(); CryptoStream csWriter = new CryptoStream(ms,crypt.CreateEncryptor(),CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(csWriter); sw.WriteLine(data); sw.Flush(); csWriter.FlushFinalBlock();
זהו, עכשיו המידע שלך מוצפן בתוך ה memoryStream ואתה יכל לעשות איתו מה שאתה רוצה, להעביר לאובייקט אחר (בד"כ ווקטור חד ממדי של bytes) או לשלוח דרך רשת או לשמור לקובץ או כל דבר. השימוש ב streams הוא מאוד נוח ומאפשר לך להצפין דברים די בקלות ובלי לדאוג לכל האלמנטים הטכנים של הצפנה (כמו חלוקת המידע לblocks לפי ה block size של אובייקט ההצפנה שלך) וזה אחת הייתרונות היפים שיש במודל ההצפנה של דוט נט. אבל הוא זמין רק בהצפנה סימטרית. פענוח של המידע המוצפן אתה עושה כמעט אותו הדבר:
string Decrypt(byte[] myKey, byte[] myIV,MemoryStream data) { RijndaelManaged crypt = new RijndaelManaged(); crypt.Key = myKey; crypt.IV = myIV; data.Position = 0; CryptoStream csReader = new CryptoStream(data,crypt.CreateEncryptor(),CryptoStreamMode.Read); StreamReader sr = new StreamReader(csReader); return sr.ReadToEnd(); }
אני מקווה שזה עזר.