Pages

Friday, July 1, 2011

Game Development With XNA - 1

ඔයගොල්ලන්ට මතකද මුලින්ම Computer එකක් අල්ලපු දවසෙ කලේ මොනවද කියල. මට නම් මතකයි. මම කලේ වෙන මොකවත් නෙවෙයි ගේම් ගහන එක තමයි. වෙන ඉති අහවල් දෙයක් කරන්නද. ඒ කලෙත් කවුරු හරි ගේම් එක Open කරල දීල ඔබන්න ඕන Keys ටිකත් පෙන්නුවට පස්සෙ ඔය ටික ඔබන එක තමයි. තව ටික කාලයක් යද්දි තනියම ගේම් එක Open කරගන්නත්, ඒක Play කරන්න ඉගෙන ගන්නත් ඉබේම වගේ පුලුවන් වුනා. හැබැයි ඒකාලෙ නම් හිතුනෙ නෑ කවුද මේ ගේම්ස් හැදුවෙ සහ කොහොමද මේව හැදුවෙ කියල. හිතන්න ඕන වුනෙත් නෑ. මොකද ඒකාලෙ ගේම්ස් ගහද්දි හිතන්න වෙන ගොඩක් දේවල් තිබුන. Need For Speed එකේ කාර් එක කොහොම හරි පාරෙ කෙලින් අරන් යන හැටි, වෙඩි තියාගන්න ගේම් එකක නම් දිගට හරහට වෙඩි තියන එවුන් ගෙන් කොහොම හරි බේරිල දුවන හැටි ගැන තමයි ඒකාලෙ හිතුනෙ :D

පස්සෙ කාලෙදි ගේම්ස් ගහන්න වගේම ගේම්ස් හදන්නත් පොඩි පොඩි ආසාවන් ඇති වුනා. ඉතින් ඔය එහෙන් මෙහෙන් Game Engine එහෙම හොයාගෙන ගේම් එකක් හදන්න ට්‍රයි එකක් දුන්නත් වැඩේ ටික දවසකින්ම එපාවුනා. මොකද මේ එක Game Engine එකක් වත් මට එච්චර ඇල්ලුවෙ නෑ. ඔහොම ඉන්න කොට තමයි Microsoft එකේ Bill අංකල් ගේ XNA කියන එක හම්බ වුනේ.අපරාදෙ කියන්න බෑ මට නම් මේක හොඳට අල්ලල ගියා. ඉතිං ඔන්න අද ඉඳන් මම කරන්න හදන්නෙ XNA ගැන මම ඉගෙන ගත්ත පොඩි පොඩි දේවල් ටිකක් හුදීජන පහන් සංවේගය උදෙසා මෙසේ ලියා තබන්න. ලියන්න කලින් කියන්න ඕන XNA ගැන මමත් මහ ලොකු දෙයක් දන්නේ නෑ. තාම දන්නෙ බොහොම ටිකයි. ඒ දන්න ටික අළුතෙන් Game development ගැන ඉගෙන ගන්න කාට හරි ප්‍රයෝජනයක් වේවි කියල හිතාගෙන තමයි මේ ලියන්නෙ. ඒවගේම තමයි මම මේ ලියන දෙයක මොකක් හරි වැරැද්දක් තිබ්බොත් මේ ගැන දන්න අය මාව නිවැරදි කරනවනම් බොහොම පිං.

මොකක්ද XNA කියන්නෙ.

XNA ගැන ඉගෙන ගන්න කලින් දැන ගන්න ඕනනේ XNA කියන්නේ මොකක්ද කියල. සමහර අය හිතන්න පුළුවන් XNA කියන්නෙ Game Engine එකක් කියල. නමුත් මේක Game Engine එකක් නෙවෙයි. මේක Framework එකක්. ඒවගේම .NET Framework එකත් එක්ක තමයි මේක වැඩ කරන්නෙ. 2D Games වගේම 3D Games හදන්නත් අවශ්‍ය කරන සියලුම පහසුකම් මේ සමඟ ලැබෙනව. අනිත් විශේෂ දේ තමයි මේ සඳහා මුදලක් ගෙවීම අවශ්‍ය නොවීම. ඒ කියන්නෙ මේක හම්බවෙන්නෙ නොමිලේ. තවදෙයක් තමයි අපිට මෙය Visual Studio එක්ක පාවිච්චි කරන්න පුළුවන් වීම. C# තමයි Code කරන්න පාවිච්චි කරන භාශාව. C# පාවිච්චි කරල පුරුදු කෙනෙක්ට ලේසියෙන්ම XNA ඉගෙන ගන්න පුළුවන්. Windows වලට වගේම Xbox හා Zune වලටත් XNA පාවිච්චි කරල ගේම්ස් හදන්න පුළුවන්. XNA වල දැනට ප්‍රධාන වශයෙන් Versions හතරක් ඇවිල්ල තියෙනව. මම මේ පාඩම් මාලාවට පාවිච්චි කරන්නෙ XNA Game Studio 3.1 කියන Version එක. මොකද මම දැනට පාවිච්චි කරන්නෙ Visual Studio 2008 (.NET Framework 3.5) නිසා. XNA Game Studio 4.0 පාවිච්චි කරන්න නම්  Visual Studio 2010(.NET Framework 4.0)  අවශ්‍ය වෙනවා.

දැන් එහෙනම් වැඩේ ඉස්සරහට කරගෙන යන්න කැමති කට්ටිය මෙතනින් ගිහිල්ල XNA Game Studio 3.1 Download කර ගන්න. Visual Studio Install කරගෙන නැත්නම් මෙතනින් ගිහිල්ල ඒකත් ගන්න. අවශ්‍යනම් Visual Studio 2008 නැතුව Visual Studio 2010 වුනත් Install කරගත්තට කමක් නෑ.

එහෙනම් ඊළඟ දවසෙ ඉඳන් XNA කුප්පිය පටන් ගමු.

Tuesday, March 22, 2011

දත්ත Encrypt කිරීම හා Decrypt කිරීම - Asymmetric Key Encryption

පසුගිය ලිපියෙන් කථා කලේ Symmetric key encryption ගැන. එතනදි වෙන්නෙ Encrypt කරන්න වගේම Decrypt කරන්නත් එකම Key එකක් භාවිතා කිරීමක්. අද ලිපියෙන් කථා කරන්නෙ Asymmetric key encryption ගැන එහෙමත් නැත්නම් Public key encryption ගැන. මෙහිදී Encrypt කරන්න එක Key එකකුත් Decrypt කරන්න තවත් Key එකකුත් භාවිතා කරනවා. මෙහි Encrypt කිරීමට භාවිතා කරන Key එක Public key වශයෙනුත් Decrypt කරන්න භාවිතා කරන Key එක Private key එක වශයෙනුත් හඳුන්වනවා. පහත රූපයෙන් දැක්වෙන්නෙ මේ ආකාරයට Encrypt කිරීම හා Decrypt කිරීම කරනු ලබන ආකාරයයි.


දැන් අපි සරලව විමසා බලමු මෙය සිදුවන ආකාරය. යම් දත්තයක් හුවමාරු කරගැනීමට අවශ්‍ය වන පාර්ශව දෙකක් සිටිනවා. දත්තය යවන පාර්ශවය Sender යනුවෙනුත්, එම දත්තය ලැබෙන පාර්ශවය Recipient යනුවෙනුත් හඳුන්වනවා. මම මුලින් සඳහන් කලා Encrypt කරන්නත් Decrypt කරන්නත් වෙන වෙනම Keys දෙකක් අවශ්‍ය බව. මෙහිදී මෙම Keys දෙකම සාදනු ලබන්නේ Recipient විසිනුයි. ඒසේ සාදනු ලබන Keys දෙකෙන් Private key එක Recipient ලඟ සුරක්ෂිතව තබා ගෙන Public key එක පමණක් Sender වෙත යවයි. ඉන්පසු Sender විසින් මෙම Public key එක මඟින් දත්තය Encrypt කර එය Recipient වෙත යවයි. දැන් Recipient ලඟ ඇති Private key එක භාවිතා කර එම දත්තය Decrypt කර ගත හැක.

Asymmetric key encryption ක්‍රමය ප්‍රමාණයෙන් විශාල දත්තයක් Encrypt කිරීමට සුදුසු වන්නේ නෑ. ඊට හේතුව නම් මෙය Symmetric key encryption ක්‍රමය තරම් වේගවත් නොවීමයි. එම නිසා සමහර අවස්ථාවන් වලදී Asymmetric key encryption ක්‍රමය හා Symmetric key encryption යන ක්‍රම දෙකම එකවිට යොදා ගෙන දත්ත හුවමාරුව සිදුකරනු ලබයි. මේ සඳහා එක් උදාහරණයක් වන්නේ HTTPS Protocol එකෙහි භාව්තයයි. (HTTPS යනු HTTP හා SSL යන Protocols දෙකෙහි එකතුවකි.) Gmail, Yahoo වැනි Email සේවාවන් වලදී මෙන්ම වෙනත් ආරක්ෂාකාරීව දත්ත හුවමාරු කරගැනීමට අවශ්‍ය වෙබ් අඩවිවල මෙම Protocol එක භාවිතා කරයි. මෙය සිදුවන ආකාරය පහත රූපයෙන් දැක්වේ.


මෙහි දැක්වෙන්නේ Web browser එකක් හා Web server එකක් අතර සිදුවන පනිවුඩ හුවමාරුවකි. අංක වලින් දක්වා ඇත්තේ පනිවුඩ හුවමාරුව සිදුවන අනුපිලිවෙලයි.

1. Web browser එක මඟින් Web server එක වෙත ආරක්ෂිත සබඳතාවයක් ඇති කර ගැනීම සඳහා ඉල්ලීමක් යැවීම. (https://mail.google.com වැනි ඉල්ලිමක්)

2. Web server එක මඟින් Public key එකක් හා Private key එකක් සදා ඉන් Public key එක SSL Certificate එක සමඟ Web browser එක වෙත එවීම.

3. Web browser එක මඟින් SSL Certificate එකෙහි වලංගුතාවය පරීක්ෂාකර බලා එය වලංගු එකක් නම් Symmetric key encryption සඳහා භාවිතා කල හැකි Key එකක් සාදා එය Web server එක විසින් එවනු ලැබූ Public key එක මඟින් Encrypt කර (Asymmetric key encryption ක්‍රමයට) එය Web server එක වෙතට යැවීම.

4. Web server එක Web browser එක මඟින් Encrypt කර එවනු ලැබූ Key එක තමා ලඟ ඇති Private key එක මඟින් Decrypt කර ගැනීම. (Asymmetric key encryption ක්‍රමයට) දැන් Web browser එක සතුව හා Web server එක සතුව Symmetric key encryption සඳහා භාවිතා කල හැකි Key එක පවතින අතර එය භාවිතා කර ආරක්ෂිත පණිවුඩ හුවමාරුව සිදුකර ගැනීම.

මෙහිදී Symmetric key encryption සඳහා භාවිතා කරන Key එක හුවමාරු කර ගැනීම සඳහා පමනක් Asymmetric key encryption ක්‍රමය යොදා ගෙන ඇති අතර අනෙකුත් දත්ත හුවමාරු කර ගැනීම සඳහා Symmetric key encryption ක්‍රමය යොදා ගෙන ඇත.

අපි ඊලඟට බලමු Asymmetric key encryption ක්‍රමයට දත්ත Encrypt කිරීම හා Decrypt කිරීම .NET භාවිතයෙන් කරන ආකාරය.

මේ සඳහා අපි භාවිතා කරන්නේ RSACryptoServiceProvider Class එකයි. මෙය භාවිතා කර දත්ත Encrypt කිරීමත් Decrypt කිරීමත් Key pair එකක් (Public key එක හා Private key එක) සකස් කරගැනීමත් කරන්න පුළුවන්. RSACryptoServiceProvider Class එක භාවිතා කර Key pair එකක් සකස් කර ගත් පසු එයින් Public key එක Export කර ගැනීමෙන් එය දත්ත Encrypt කරගැනීම සඳහා භාවිතා කරන්න පුළුවන්. මේ සඳහා RSACryptoServiceProvider Class එකෙහි ToXmlString Method එක භාවිතා කල හැකිය. මෙහි Parameter එක වශයෙන් false යෙදීමෙන් Public key එක පමණක් Export වේ. මෙහි Parameter එක වශයෙන් true යෙදීමෙන් Public key එක මෙන්ම Private key එකත් Export කර ගත හැකිය. මෙහිදී Keys Export වන්නේ XML Format එකෙනි. එම නිසා පහසුවෙන් මෙය පරිඝණක දෙකක් අතර හුවමාරු කර ගත හැකිය.

අනෙක් වැදගත් කාරණය වන්නේ Encrypt කරන ලද දත්තයක් නැවත Decrypt කර ගැනීම සඳහා Private key එක වෙනම ගබඩා කරගෙන සිටිය යුතු වීමයි. මෙම Key එක පරිඝණකයේ ගබඩා කිරීම හා Decrypt කිරීමේදී නැවත එය ලබා ගැනීමට .NET Framework එකට ස්වයංක්‍රීයව සිදුකල හැකියි. RSACryptoServiceProvider Class එකෙහි PersistKeyInCsp Method එක භාවිතා කර Private key එක පමණක් පරිඝණකයේ ගබඩා කල හැකිය. මීට සහය වීම සඳහා තවත් Class එකක් භාවිතා කල යුතුය. එය නම් CspParameters Class එකයි. මෙය භාවිතා කරන අන්දම පහත Code එකෙන් දැක්වේ.
CspParameters csp = new CspParameters();
csp.KeyContainerName = "privatekey";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
rsa.PersistKeyInCsp = true;
මෙහි csp යනුවෙන් CspParameters Object එකක් සකස් කර ඇත. ඉන් පසු එහි KeyContainerName වලට යම් නමක් දිය හැකිය. මම මෙහිදී privatekey යනුවෙන් නම සඳහන් කර ඇත. මෙහිදී සිදුවන්නේ එම නමින් Container එකක් සකස් කර ගැනීමයි. ඉන්පසු rsa යනුවෙන් RSACryptoServiceProvider Object එකක් සාදා එහි Constructor එකට csp Object එක ලබා දී ඇත. අවසාන වශයෙන් මෙහිදී සිදුවන්නේ rsa Object එක මඟින් සකස් කරන Private key එක privatekey යනුවෙන් Container එකක් සකස් කර එහි ගබඩා කිරීමයි. Decrypt කිරීමකදී මෙම Private key එක අවශ්‍ය වූ විට ස්වයංක්‍රීයව එය ලබා ගත හැක.

දැන් අපි සරල උදාහරණයකින් මෙය විමසා බලමු. මා මේ සඳහා වෙන වෙනම Application දෙකක් සකස් කර ගන්නවා, එකක් Key pair එක සකස් කර එය Export කර ගැනීමට හා Decrypt කිරීමටත්, අනෙක Export කරන ලද Public key එක ලබා ගෙන එය භාවිතා කර File එකක් Encrypt කිරීමටත් යොදා ගන්නවා.

පළමු Application එක පහත පරිදි Code කර ගන්න පුළුවන්.
void ExportKey() {
   CspParameters csp = new CspParameters();
   csp.KeyContainerName = "privatekey";
   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
   rsa.PersistKeyInCsp = true;
   string xml = rsa.ToXmlString(false);
   StreamWriter writer = new StreamWriter(@"c:\key.xml");
   writer.Write(xml);
   writer.Close();
}
මෙහිදී සිදුවන්නේ ras Object එක මඟින් නිර්මාණය කරන Private key එක පරිඝණකයේ ගබඩා කිරීමත්, Public key එක XML File එකක් වශයෙන් ගබඩාකර ගැනීමත්ය.
void Decrypt() {
   CspParameters csp = new CspParameters();
   csp.KeyContainerName = "privatekey";
   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
   FileStream input = new FileStream(@"C:\encrypted file.txt", FileMode.Open, FileAccess.Read);
   byte[] encdata = new byte[input.Length];
   input.Read(encdata, 0, (int)input.Length);
   input.Close();
   byte[] decdata = rsa.Decrypt(encdata, false);
   FileStream output = new FileStream(@"C:\decrypted file.txt", FileMode.Create, FileAccess.Write);
   output.Write(decdata, 0, decdata.Length);
   output.Close();
}
මෙහිදී සිදුවන්නේ privatekey යනුවෙන් සඳහන් Container එකෙන් Private key එක ලබා ගෙන එමඟින් encrypted file.txt යන File එක Decrypt කර එය decrypted file.txt යනුවෙන් Save කර ගැනීමයි.

අපගේ දෙවැනි Application එක පහත පරිදි විය යුතුයි.
void Encrypt() {
   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
   StreamReader reader = new StreamReader(@"c:\key.xml");
   rsa.FromXmlString(reader.ReadToEnd());
   FileStream input = new FileStream(@"C:\original file.txt", FileMode.Open, FileAccess.Read);
   byte[] data = new byte[input.Length];
   input.Read(data, 0, (int)input.Length);
   input.Close();
   byte[] encdata = rsa.Encrypt(data, false);
   FileStream output = new FileStream(@"C:\encrypted file.txt", FileMode.Create, FileAccess.Write);
   output.Write(encdata, 0, encdata.Length);
   output.Close();
}
මෙහිදී මුලින්ම rsa Object එක මඟින් XML File එකක් වශයෙන් තියෙන Public key එක ලබා ගනියි. ඒ සඳහා FromXmlString Method එක භාවිතා කර ඇත. ඉන් පසු එම Public key එක භාවිතා කර original file.txt යනුවෙන් සඳහන් File එක Encrypt එය encrypted file.txt යනුවෙන් Save කර ගනියි.

මෙය භාවිතා කිරීමේදී මුලින්ම පලමු Application එකෙහි ExportKey Method එක Call කර පසුව දෙවන Application එකෙහි Encrypt Method එක Call කරන්න. පසුව Encrypt වූ File එක Decrypt කර ගැනීමට පලමු Application එකෙහි Decrypt Method එක Call කරන්න.

Sunday, March 6, 2011

දත්ත Encrypt කිරීම හා Decrypt කිරීම - Symmetric Key Encryption

මම කලින් ලිපියෙ කිව්වෙ Hash value එක ගැන. මේ වගේ දෙයක් අවශ්‍ය වෙන්නෙ අපි භාවිතා කරන දත්ත වලට ආරක්ෂාවක් ලබා දීමටයි. අද මම කියන්න යන්නෙත් දත්ත ආරක්ෂාව හා සම්භන්ධ තවත් වැදගත් දෙයක් වන Encryption සම්භන්ධවයි.

රහස්‍ය භාවය රැකීම අත්‍යාවශ්‍ය වන දත්තයක් යම් පාර්ශව දෙකක් අතර හුවමාරු කර ගැනීමේදී එය තෙවන පාර්ශවයක් අතට පත් වුවහොත් ඉන් අත්වන ප්‍රථිපලය භයානක විය හැකියි. උදාහරණයක් විදියට 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 එකකුත් යොදා ගන්නවා.


ඉහත රූපයෙන් දැක්වෙන්නේ Symmetric key encryption ක්‍රමය සිදුවන ආකාරයයි. මෙහිදී Sender විසින් Plain text ආකාරයට යවන දත්තයක් Key එකක් භාවිතා කර Encrypt කර ගැනීමක් සිදුකරනවා. මෙසේ Encrypt කරන ලද දත්තය Cipher text යනුවෙන් හඳුන්වනවා. නැවත එම Cipher text එක පෙර භාවිතා කල Key එකම භාවිතා කර Decrypt කර Recipient වෙත ලැබෙන්නට සලස්වනවා.

දැන් අපි බලමු .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 ආකාරය ගැන.