|  
                                             Ich habe in Zusammenarbeit mit einem Firmen-Kollegen, der sich in VBA einigermaßen auskennt, ein Excel-Rechenprogram erstellt. Ich kenne mich mit VBA nicht aus und habe lediglich die Berechnungsformeln in Excel erstellt und mein Kollege hat die dazu erforderlichen Eingabemasken ausgearbeitet. 
Das Programm soll einigen Interssenten zur Verfügung gestellt werden. Damit jedoch die einfache Weitergabe verhindert werden kann, ist die Vergabe eines Passwortes vorgesehen, dass mit dem MD5 Hash im Programm hinterlegt wird. Trägt der Anwender das Passwort ein, dann wird geprüft, ob der aus dem Passwort gebildete MD5 Hash mit dem im Programm hinterlegten MD5 Hash übereinstimmt. 
Das von dem Kollegen geschriebene und unten angefügte Programm hat jedoch leider nur bei Excel Anwendungen auf einem Rechnern mit 32 Bit Prozessor funktioniert. Bei der Anwendung auf meinem PC mit 64-Bit Prozessor wird folgender Laufzeitfehler angezeigt: 
Laufzeitfehler ´9´ Index außerhalb des gültigen Bereichs 
Im Debugger ist folgende Programmzeile (achtletzte Zeile im nachstehend aufgeführten Programm) gelb gekennzeichnet: 
  
ReDim ByteResult(0 To LängeResult - 1) As Byte 
  
Hier das Programm:  
  
Option Explicit 
  
Private Declare PtrSafe Function CryptAcquireContext Lib "advapi32.dll" _ 
  Alias "CryptAcquireContextA" ( _ 
  ByRef phProv As Long, _ 
  ByVal pszContainer As String, _ 
  ByVal pszProvider As String, _ 
  ByVal dwProvType As Long, _ 
  ByVal dwFlags As Long) As Long 
  
Private Declare PtrSafe Function CryptReleaseContext Lib "advapi32.dll" ( _ 
  ByVal hProv As Long, _ 
  ByVal dwFlags As Long) As Long 
  
Private Declare PtrSafe Function CryptCreateHash Lib "advapi32.dll" ( _ 
  ByVal hProv As Long, _ 
  ByVal Algid As Long, _ 
  ByVal hKey As Long, _ 
  ByVal dwFlags As Long, _ 
  ByRef phHash As Long) As Long 
  
Private Declare PtrSafe Function CryptDestroyHash Lib "advapi32.dll" ( _ 
  ByVal hHash As Long) As Long 
  
Private Declare PtrSafe Function CryptHashData Lib "advapi32.dll" ( _ 
  ByVal hHash As Long, _ 
  pbData As Byte, _ 
  ByVal dwDataLen As Long, _ 
  ByVal dwFlags As Long) As Long 
  
Private Declare PtrSafe Function CryptGetHashParam Lib "advapi32.dll" ( _ 
  ByVal hHash As Long, _ 
  ByVal dwParam As Long, _ 
  pbData As Any, _ 
  pdwDataLen As Long, _ 
  ByVal dwFlags As Long) As Long 
  
Private Const ALG_CLASS_HASH As Long = (4 * 2 ^ 13) 
Private Const ALG_SID_HMAC As Long = 9 
Private Const ALG_SID_MD2 As Long = 1 
Private Const ALG_SID_MD4 As Long = 2 
Private Const ALG_SID_MD5 As Long = 3 
Private Const ALG_SID_SHA As Long = 4 
Private Const ALG_SID_SHA1 As Long = 4 
Private Const ALG_TYPE_ANY As Long = 0 
Private Const CALG_MD2 As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2) 
Private Const CALG_MD4 As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4) 
Private Const CALG_MD5 As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5) 
Private Const CALG_SHA1 As Long = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1) 
  
Enum Algorithmus 
    md2 = CALG_MD2 
    md4 = CALG_MD4 
    md5 = CALG_MD5 
    SHA1 = CALG_SHA1 
End Enum 
  
Function Crypt(Text As String, Art As Algorithmus) As String 
Dim AcquireContext As Long 
Dim HashHandle As Long 
Dim result As Long 
Dim ByteText() As Byte 
Dim LängeResult As Long 
Dim ByteResult() As Byte 
Dim Zähler As Integer 
ByteText() = StrConv(Text, vbFromUnicode) 
  
result = CryptAcquireContext(AcquireContext, vbNullString, vbNullString, 1, 0) 
If result = 0 And Err.LastDllError = &H80090016 Then _ 
    result = CryptAcquireContext(AcquireContext, vbNullString, vbNullString, 1, &H8) 
 result = CryptCreateHash(AcquireContext, Art, 0, 0, HashHandle) 
 result = CryptHashData(HashHandle, ByteText(0), Len(Text), 0) 
 result = CryptGetHashParam(HashHandle, 4, LängeResult, 4, 0) 
 ReDim ByteResult(0 To LängeResult - 1) As Byte 
result = CryptGetHashParam(HashHandle, 2, ByteResult(0), LängeResult, 0) 
  
For Zähler = 0 To UBound(ByteResult) 
    Crypt = Crypt & Right$("0" & Hex$(ByteResult(Zähler)), 2) 
  
Next 
  
CryptDestroyHash HashHandle 
CryptReleaseContext AcquireContext, 0 
 End Function 
     |