Public Class clsCrypto
Private bytIV() As Byte = {121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62}
Private Const chrKeyFill As Char = "X"c
Private Const strTextErrorString As String = "#ERROR - {0}"
Private Const intMinSalt As Integer = 4
Private Const intMaxSalt As Integer = 8
Private Const intHashSize As Integer = 16
Private Const intKeySize As Integer = 32
Public Function EncryptString128Bit(ByVal strPlainText As String, ByVal strKey As String) As String
Try
Dim bytPlainText() As Byte
Dim bytKey() As Byte
Dim bytEncoded() As Byte
Dim objMemoryStream As New MemoryStream
Dim objRijndaelManaged As New RijndaelManaged
strPlainText = strPlainText.Replace(vbNullChar, String.Empty)
bytPlainText = Encoding.UTF8.GetBytes(strPlainText)
bytKey = ConvertKeyToBytes(strKey)
Dim objCryptoStream As New CryptoStream(objMemoryStream, _
objRijndaelManaged.CreateEncryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
objCryptoStream.Write(bytPlainText, 0, bytPlainText.Length)
objCryptoStream.FlushFinalBlock()
bytEncoded = objMemoryStream.ToArray
objMemoryStream.Close()
objCryptoStream.Close()
Return Convert.ToBase64String(bytEncoded)
Catch ex As Exception
Return String.Format(strTextErrorString, ex.Message)
End Try
End Function
Public Function DecryptString128Bit(ByVal strCryptText As String, ByVal strKey As String) As String
Try
Dim bytCryptText() As Byte
Dim bytKey() As Byte
Dim objRijndaelManaged As New RijndaelManaged
bytCryptText = Convert.FromBase64String(strCryptText)
bytKey = ConvertKeyToBytes(strKey)
Dim bytTemp(bytCryptText.Length) As Byte
Dim objMemoryStream As New MemoryStream(bytCryptText)
Dim objCryptoStream As New CryptoStream(objMemoryStream, _
objRijndaelManaged.CreateDecryptor(bytKey, bytIV), _
CryptoStreamMode.Read)
objCryptoStream.Read(bytTemp, 0, bytTemp.Length)
objMemoryStream.Close()
objCryptoStream.Close()
Return Encoding.UTF8.GetString(bytTemp).Replace(vbNullChar, String.Empty)
Catch ex As Exception
Return String.Format(strTextErrorString, ex.Message)
End Try
End Function
Public Function ComputeMD5Hash(ByVal strPlainText As String, Optional ByVal bytSalt() As Byte = Nothing) As String
Try
Dim bytPlainText As Byte() = Encoding.UTF8.GetBytes(strPlainText)
Dim hash As HashAlgorithm = New MD5CryptoServiceProvider()
If bytSalt Is Nothing Then
Dim rand As New Random
Dim intSaltSize As Integer = rand.Next(intMinSalt, intMaxSalt)
bytSalt = New Byte(intSaltSize - 1) {}
Dim rng As New RNGCryptoServiceProvider
rng.GetNonZeroBytes(bytSalt)
End If
Dim bytPlainTextWithSalt() As Byte = New Byte(bytPlainText.Length + bytSalt.Length - 1) {}
bytPlainTextWithSalt = ConcatBytes(bytPlainText, bytSalt)
Dim bytHash As Byte() = hash.ComputeHash(bytPlainTextWithSalt)
Dim bytHashWithSalt() As Byte = New Byte(bytHash.Length + bytSalt.Length - 1) {}
bytHashWithSalt = ConcatBytes(bytHash, bytSalt)
Return Convert.ToBase64String(bytHashWithSalt)
Catch ex As Exception
Return String.Format(strTextErrorString, ex.Message)
End Try
End Function
Public Function VerifyHash(ByVal strPlainText As String, ByVal strHashValue As String) As Boolean
Try
Dim bytWithSalt As Byte() = Convert.FromBase64String(strHashValue)
If bytWithSalt.Length < intHashSize Then Return False
Dim bytSalt() As Byte = New Byte(bytWithSalt.Length - intHashSize - 1) {}
Array.Copy(bytWithSalt, intHashSize, bytSalt, 0, bytWithSalt.Length - intHashSize)
Dim strExpectedHashString As String = ComputeMD5Hash(strPlainText, bytSalt)
Return strHashValue.Equals(strExpectedHashString)
Catch ex As Exception
Return Nothing
End Try
End Function
Private Function ConcatBytes(ByVal bytA() As Byte, ByVal bytB() As Byte) As Byte()
Try
Dim bytX() As Byte = New Byte(((bytA.Length + bytB.Length)) - 1) {}
Array.Copy(bytA, bytX, bytA.Length)
Array.Copy(bytB, 0, bytX, bytA.Length, bytB.Length)
Return bytX
Catch ex As Exception
Return Nothing
End Try
End Function
Private Function ConvertKeyToBytes(ByVal strKey As String) As Byte()
Try
Dim intLength As Integer = strKey.Length
If intLength < intKeySize Then
strKey &= Strings.StrDup(intKeySize - intLength, chrKeyFill)
Else
strKey = strKey.Substring(0, intKeySize)
End If
Return Encoding.UTF8.GetBytes(strKey)
Catch ex As Exception
Return Nothing
End Try
End Function
End Class
Private bytIV() As Byte = {121, 241, 10, 1, 132, 74, 11, 39, 255, 91, 45, 78, 14, 211, 22, 62}
Private Const chrKeyFill As Char = "X"c
Private Const strTextErrorString As String = "#ERROR - {0}"
Private Const intMinSalt As Integer = 4
Private Const intMaxSalt As Integer = 8
Private Const intHashSize As Integer = 16
Private Const intKeySize As Integer = 32
Public Function EncryptString128Bit(ByVal strPlainText As String, ByVal strKey As String) As String
Try
Dim bytPlainText() As Byte
Dim bytKey() As Byte
Dim bytEncoded() As Byte
Dim objMemoryStream As New MemoryStream
Dim objRijndaelManaged As New RijndaelManaged
strPlainText = strPlainText.Replace(vbNullChar, String.Empty)
bytPlainText = Encoding.UTF8.GetBytes(strPlainText)
bytKey = ConvertKeyToBytes(strKey)
Dim objCryptoStream As New CryptoStream(objMemoryStream, _
objRijndaelManaged.CreateEncryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
objCryptoStream.Write(bytPlainText, 0, bytPlainText.Length)
objCryptoStream.FlushFinalBlock()
bytEncoded = objMemoryStream.ToArray
objMemoryStream.Close()
objCryptoStream.Close()
Return Convert.ToBase64String(bytEncoded)
Catch ex As Exception
Return String.Format(strTextErrorString, ex.Message)
End Try
End Function
Public Function DecryptString128Bit(ByVal strCryptText As String, ByVal strKey As String) As String
Try
Dim bytCryptText() As Byte
Dim bytKey() As Byte
Dim objRijndaelManaged As New RijndaelManaged
bytCryptText = Convert.FromBase64String(strCryptText)
bytKey = ConvertKeyToBytes(strKey)
Dim bytTemp(bytCryptText.Length) As Byte
Dim objMemoryStream As New MemoryStream(bytCryptText)
Dim objCryptoStream As New CryptoStream(objMemoryStream, _
objRijndaelManaged.CreateDecryptor(bytKey, bytIV), _
CryptoStreamMode.Read)
objCryptoStream.Read(bytTemp, 0, bytTemp.Length)
objMemoryStream.Close()
objCryptoStream.Close()
Return Encoding.UTF8.GetString(bytTemp).Replace(vbNullChar, String.Empty)
Catch ex As Exception
Return String.Format(strTextErrorString, ex.Message)
End Try
End Function
Public Function ComputeMD5Hash(ByVal strPlainText As String, Optional ByVal bytSalt() As Byte = Nothing) As String
Try
Dim bytPlainText As Byte() = Encoding.UTF8.GetBytes(strPlainText)
Dim hash As HashAlgorithm = New MD5CryptoServiceProvider()
If bytSalt Is Nothing Then
Dim rand As New Random
Dim intSaltSize As Integer = rand.Next(intMinSalt, intMaxSalt)
bytSalt = New Byte(intSaltSize - 1) {}
Dim rng As New RNGCryptoServiceProvider
rng.GetNonZeroBytes(bytSalt)
End If
Dim bytPlainTextWithSalt() As Byte = New Byte(bytPlainText.Length + bytSalt.Length - 1) {}
bytPlainTextWithSalt = ConcatBytes(bytPlainText, bytSalt)
Dim bytHash As Byte() = hash.ComputeHash(bytPlainTextWithSalt)
Dim bytHashWithSalt() As Byte = New Byte(bytHash.Length + bytSalt.Length - 1) {}
bytHashWithSalt = ConcatBytes(bytHash, bytSalt)
Return Convert.ToBase64String(bytHashWithSalt)
Catch ex As Exception
Return String.Format(strTextErrorString, ex.Message)
End Try
End Function
Public Function VerifyHash(ByVal strPlainText As String, ByVal strHashValue As String) As Boolean
Try
Dim bytWithSalt As Byte() = Convert.FromBase64String(strHashValue)
If bytWithSalt.Length < intHashSize Then Return False
Dim bytSalt() As Byte = New Byte(bytWithSalt.Length - intHashSize - 1) {}
Array.Copy(bytWithSalt, intHashSize, bytSalt, 0, bytWithSalt.Length - intHashSize)
Dim strExpectedHashString As String = ComputeMD5Hash(strPlainText, bytSalt)
Return strHashValue.Equals(strExpectedHashString)
Catch ex As Exception
Return Nothing
End Try
End Function
Private Function ConcatBytes(ByVal bytA() As Byte, ByVal bytB() As Byte) As Byte()
Try
Dim bytX() As Byte = New Byte(((bytA.Length + bytB.Length)) - 1) {}
Array.Copy(bytA, bytX, bytA.Length)
Array.Copy(bytB, 0, bytX, bytA.Length, bytB.Length)
Return bytX
Catch ex As Exception
Return Nothing
End Try
End Function
Private Function ConvertKeyToBytes(ByVal strKey As String) As Byte()
Try
Dim intLength As Integer = strKey.Length
If intLength < intKeySize Then
strKey &= Strings.StrDup(intKeySize - intLength, chrKeyFill)
Else
strKey = strKey.Substring(0, intKeySize)
End If
Return Encoding.UTF8.GetBytes(strKey)
Catch ex As Exception
Return Nothing
End Try
End Function
End Class
No comments:
Post a Comment