රහස්ය භාවය රැකීම අත්යාවශ්ය වන දත්තයක් යම් පාර්ශව දෙකක් අතර හුවමාරු කර ගැනීමේදී එය තෙවන පාර්ශවයක් අතට පත් වුවහොත් ඉන් අත්වන ප්රථිපලය භයානක විය හැකියි. උදාහරණයක් විදියට E-Mail ගිණුමට පිවිසීම සඳහා දෙනු ලබන මුරපදය E-Mail Client එක හා Mail Server එක අතර හුවමාරු වීමේදී අතරමැද සිටින්නෙකු විසින් එම මුරපදය ලබා ගත හොත් එය විශාල හානියක් විය හැකියි. මේ සඳහා භාවිතා කරනු ලබන ආරක්ෂක උපක්රමය නම් මුරපදය Encrypt කර යැවීමයි. මෙවිට අතරමැදියෙකුට Encrypt වූ මුරපදය ලබා ගැනීමට හැකි වුවත් නියම මුරපදය ලබා ගැනීමට හැකියාවක් ලැබෙන්නේ නෑ.
Encrypt ගැන කථා කරද්දි කියැවෙන අනිත් දේ තමයි Decrypt කියන එක. Encrypt කරන ලද දත්තයකින් නැවත මුල් දත්තය ලබා ගැනීමට Decrypt කිරීම අවශ්ය වේ.
Encrypt කරන මූලික ආකාර 2 ක් තියෙනවා. එකක් තමයි Symmetric key encryption එහෙමත් නැත්නම් Secret key encryption. අනෙක තමයි Asymmetric key encryption එහෙමත් නැත්නම් Public key encryption. මම අද කියන්න හදන්නේ මේ පලවෙනි ක්රමය ගැන. ඒ කියන්නෙ Symmetric key encryption ගැන.
මෙතනදි වැදගත් වන තවත් දෙයක් තමයි Key එක. දත්තයක් Encrypt කරන්න වගේම Decrypt කරන්නත් Key එකක් අවශ්ය වෙනවා. Symmetric key encryption ක්රමයේදී Encrypt කරන්න වගේම Decrypt කරන්නත් යොදා ගන්නේ එකම Key එකක්. Asymmetric key encryption ක්රමයේ දී Encrypt කරන්න එක Key එකකුත් Decrypt කරන්න තවත් Key එකකුත් යොදා ගන්නවා.
දැන් අපි බලමු .NET භාවිතා කර Encrypt කිරීම හා Decrypt කරන අකාරය. මේ සඳහා භාවිතා කල හැකි Algorithms කිහිපයක්ම .NET තුල Implement කර තියෙනවා. RijndaelManaged, DES, TripleDES වැනි Classes අපට මේ සඳහා යොදා ගත හැකියි. මම අද භාවිතා කරන්නේ RijndaelManaged Class එකයි. මෙය System.Security.Cryptography Namespace එක තුල සොයා ගත හැකිය.
Encrypt කිරීමක් කරන්න කලින් ඒ සඳහා අවශ්ය Key එක සකස් කර ගැනීම කරන්න වෙනවා. අපි මුලින් ම බලමු මේ Key එක සකස් කරන ආකාරය. මේ සඳහා අපිට Rfc2898DeriveBytes Class එක භාවිතා කරන්න පුළුවන්. මෙහිදී සිදුවන්නේ අපි ලබා දෙන මුරපදයකට අනුව Key එකක් සකස් කර ගැනීමයි. එවිට අපිට මුරපදයක් භාවිතයෙන් පහසුවෙන්ම Encrypt කිරීම හා Decrypt කර ගත හැකියි. මෙහිදී අප ලබා දෙන මුරපදය කෙලින්ම Key එක වශයෙන් භාවිතා නොකරන අතර මුරපදයට අනුව Key එකක් නිපදවා එම Key එක භාවිතා කිරීම පමණක් සිදුකරනු ලබයි. මෙම Key එක සකස් කර ගැනීමට අපට මුරපදයට අමතරව Salt යනුවෙන් තවත් Value එකක් අවශ්ය වෙනවා. මෙය Byte Array එකක් වශයෙන් ලබා දිය යුතු වන අතර මෙහි අවම වශයෙන් Bytes 8 ක් වත් තිබිය යුතුය.
පහත Code එකෙන් Key එක හදා ගන්න ආකාරය දැක් වෙනවා.
string password = "mypassword"; byte[] salt = Encoding.ASCII.GetBytes("salt value"); Rfc2898DeriveBytes keygen = new Rfc2898DeriveBytes(password, salt); RijndaelManaged enc = new RijndaelManaged(); enc.Key = keygen.GetBytes(enc.KeySize / 8); enc.IV = keygen.GetBytes(enc.BlockSize / 8);මෙහිදී Rfc2898DeriveBytes Class එකේ Constructor එකට password එක හා salt එක දී තිබෙනවා. ඉන් පසු RijndaelManaged object එකෙහි Key එක ලබා ගන්න පුලුවන්. මෙහි IV (Initial Vector) යනුවෙන්ද Property එකක් ඇති බව දැක ගත හැකියි. මින් සිදු වන්නේ Encrypt කරන ලද දත්ත තව දුරටත් ආරක්ෂා කිරීමක්. මෙයද Key එක මෙන් Encrypt කිරීම හා Decrypt කිරීම යන අවස්ථා දෙකටම අවශ්ය වෙනවා.
පහත Code එකෙන් දැක්වෙන්නේ Plain text ආකාරයට ඇති File එකක් Encrypt කරන ආකාරයයි.
FileStream input = new FileStream(@"c:\myfile.txt", FileMode.Open, FileAccess.Read); FileStream output = new FileStream(@"c:\myencfile.txt", FileMode.Create, FileAccess.Write); byte[] encdata = new byte[input.Length]; input.Read(encdata, 0, (int)input.Length); ICryptoTransform crypto = enc.CreateEncryptor(); CryptoStream str = new CryptoStream(output, crypto, CryptoStreamMode.Write); str.Write(encdata, 0, encdata.Length); str.Close(); input.Close(); output.Close();මෙහිදී Encrypt කර ගැනීමට අවශ්ය File එක Open කර ගැනීමට input යනුවෙන්ද, Encrypt වූ File එක Save කර ගැනීමට output යනුවෙන්ද FileStream දෙකක් භාවිතා කර තිබෙනවා. ඉන්පසු encdata නමින් byte Array එකක් සාදා input එකෙහි ඇති Data එයට ලියා ගෙන ඇත.
මෙහිදී Encrypt කරන ලද දත්ත output File Stream එකට ලියාගැනීමට CryptoStream Object එකක් භාවිතා කරන්න පුලුවන්.
මේ අකාරයෙන් Encrypt කරන ලද File එක පහත ආකාරයට Decrypt කරගන්න පුළුවන්. මෙහිදී Key එක හා IV එක, Encrypt කිරීමේදී යොදා ගත් ආකාරයෙන්ම යොදාගත යුතුයි. ඒ සඳහා password එක හා salt එක එකම ආකාරයෙන් ලබා දිය යුතුයි.
string password = "mypassword"; byte[] salt = Encoding.ASCII.GetBytes("salt value"); Rfc2898DeriveBytes keygen = new Rfc2898DeriveBytes(password, salt); RijndaelManaged dec = new RijndaelManaged(); dec.Key = keygen.GetBytes(dec.KeySize / 8); dec.IV = keygen.GetBytes(dec.BlockSize / 8); FileStream input = new FileStream(@"c:\myencfile.txt", FileMode.Open, FileAccess.Read); FileStream output = new FileStream(@"c:\mydecfile.txt", FileMode.Create, FileAccess.Write); ICryptoTransform crypto = dec.CreateDecryptor(); CryptoStream str = new CryptoStream(input, crypto, CryptoStreamMode.Read); byte[] decdata = new byte[input.Length]; str.Read(decdata, 0, (int)input.Length); output.Write(decdata, 0, decdata.Length); str.Close(); input.Close(); output.Close();මේ අපි කලේ Symmetric key encription කියන ආකාරය. ඒ කියන්නේ Encrypt කිරීමට හා Decrypt කිරීමට එකම Key එකක් භාවිතා කිරීම. ඊළඟ ලිපියෙන් බලමු Asymmetric key encription ආකාරය ගැන.
8 comments:
machn ela bng uba kohamda bng mewaa danee ne uba sofwere enginr kenk da maxxaaa bng thwath weda kali ehema dapn elazzz
wwww.facebook.com/mnshabri
අනේ මම Software engineer කෙනෙක් නම් නෙවි බන්. මාත් තාම ඉගෙන ගන්න එකෙක්.
ela wadak...
@ dinesh
තැංකූ තැංකූ :D
එල මචන් දිගටම කරපන්. උබට ජය........
@ M.N.M. Farhan
Thanks මචං
very good ayya ...ikamanata anek tikath danna
maxaaaaaaa article.....keep it up....:D
Post a Comment