Pages

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 එක ලියා ගන්න.
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 එකක් ලබා ගෙන තියෙනවා. ඊට පසුව ඇති දේවල් පෙර පරිදිමයි.

එහෙනම් අදට නැවතුනා. අයිත් දවසක හම්බ වෙමු. ජයවේවා.

Sunday, December 12, 2010

GDI+ භාවිතයෙන් Pictures වලට Effects යෙදීම - දෙවන කොටස

පසුගිය ලිපියෙන් GDI+ භාවිතා කරල Picture එකකට Effects ලබා දීම ගැන කථා කලා. අද ලිපියෙනුත් තවත් Effects කිහිපයක් ලබා දෙන අකාරය ගැන බලමු.

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 එකක් අවශ්‍ය වේ.