Hallo habe in VB6 Folgenden Code um eine HMAC MD5 Prüfsumme zu errechnen. Ich kriegs aber unter Vb.net keine Korrekten ergebnise.
Gibt es eine Ersatzfunction für StrConv? Ich benutze
bytExpression1 = Encoding.ASCII.GetBytes(Expression1) Die Function MD5 habe ich in VB.Net ersetzt. durch
Private Function MD5(ByVal Key As String) As String
Dim tmpSource() As Byte
Dim tmpHash() As Byte
Dim md As New MD5CryptoServiceProvider
tmpSource = ASCIIEncoding.ASCII.GetBytes(Key)
tmpHash = md.ComputeHash(tmpSource)
Return ByteArrayToString(tmpHash)
End Function
Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
Dim i As Integer
Dim sOutput As New StringBuilder(arrInput.Length)
For i = 0 To arrInput.Length - 1
sOutput.Append(arrInput(i).ToString("x2"))
Next
Return sOutput.ToString()
End Function So siehts es in VB6 aus. Benutze das ganze um einen SMTP CRAM-MD5 Login zu machen. Und Wollte es nun umsetzten.
Private Function MD5(Key As String) As String
Dim strHash As String
Dim lngResult As Long
Dim lngHHash As Long
Dim lngHCryptProvider As Long
Dim lngHashLength As Long
Dim i As Long
Dim abytBuffer() As Byte
'
Const cstBufferSize As Long = 256
'
ReDim abytBuffer(0 To cstBufferSize)
'
lngResult = CryptAcquireContext(lngHCryptProvider, vbNullString, _
MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
If lngResult = 1 Then
lngResult = CryptCreateHash(lngHCryptProvider, CALG_MD5, 0, 0, lngHHash)
If lngResult = 1 Then
lngResult = CryptHashData(lngHHash, Key, Len(Key), 0)
If lngResult = 1 Then
lngResult = CryptGetHashParam(lngHHash, HP_HASHSIZE, abytBuffer( _
0), cstBufferSize, 0)
If lngResult = 1 Then
lngHashLength = abytBuffer(0)
lngResult = CryptGetHashParam(lngHHash, HP_HASHVAL, _
abytBuffer(0), cstBufferSize, 0)
If lngResult = 1 Then
For i = 0 To (lngHashLength - 1)
If abytBuffer(i) < 16 Then
strHash = strHash & "0"
End If
strHash = strHash & LCase(Hex(abytBuffer(i)))
Next i
End If
End If
End If
End If
End If
'
MD5 = strHash
End Function
'Private Function HMAC_MD5(Key As String, Data As String) As String
Dim iPad As String
Dim oPad As String
'
Const MD5_BLOCK_LEN As Long = &H40&
'
If Len(Key) > MD5_BLOCK_LEN Then
Key = Pack(MD5(Key))
End If
'
Key = Key & String((MD5_BLOCK_LEN - Len(Key)), vbNullChar)
'
iPad = String(MD5_BLOCK_LEN, Chr$(&H36))
oPad = String(MD5_BLOCK_LEN, Chr$(&H5C))
'
iPad = StrXor(Key, iPad)
oPad = StrXor(Key, oPad)
'
HMAC_MD5 = MD5(oPad & Pack(MD5(iPad & Data)))
End Function
Private Function StrXor(Expression1 As String, Expression2 As String) As String
Dim strReturn As String
Dim i As Long
Dim bytReturn() As Byte
Dim bytExpression1() As Byte
Dim bytExpression2() As Byte
'
If Len(Expression1) = Len(Expression2) Then
bytExpression1() = StrConv(Expression1, vbFromUnicode)
bytExpression2() = StrConv(Expression2, vbFromUnicode)
'
ReDim bytReturn(LBound(bytExpression1()) To UBound(bytExpression1()))
'
For i = LBound(bytExpression1()) To UBound(bytExpression1())
bytReturn(i) = bytExpression1(i) Xor bytExpression2(i)
Next i
'
strReturn = StrConv(bytReturn(), vbUnicode)
End If
'
StrXor = strReturn
End Function
Private Function Pack(strData As String) As String
Dim strPack As String
Dim lngLen As Long
Dim lngPos As Long
'
lngLen = Len(strData)
lngPos = 1
'
Do While (lngPos < lngLen)
strPack = strPack & Chr$(Val("&H" & Mid(strData, lngPos, 2)))
lngPos = lngPos + 2
Loop
'
Pack = strPack
End Function V ielen Dank schon mal im vorraus
mfg Chris |