[dba-Tech] Hash Algorithm

Gustav Brock Gustav at cactus.dk
Mon Feb 28 10:47:03 CST 2005


Hi JR

What you describe is en/decryption, not a hash algorithm which is "one
way" only.
We use the module below for this which runs very fast.

/gustav


Option Compare Database
Option Explicit

' PC1 Cipher 128-bit key
' (c) Alexander Pukall 1991
' Can be used freely even for commercial applications
'
' MS Access 97 version by
' Gustav Brock, Cactus Data ApS
' gustav at cactus.dk 
'
' 2002-03-09. V1.0
'   Initial port from Visual Basic.
' 2002-06-23. V1.1
'   Code clean up and constants added.
'   Redundant code removed.
'   Modified to fully comply with VB datatypes.
'   Modified to not crash for certain passwords.
'   Modified for high speed conversion of long strings ( > 32K).
' 2002-06-24. V1.2
'   Functions added for en/decrypting to/from binary strings.

' Usage:
'   SetPassword(password) sets password prior to en/decryption.
'   GetPassword() retrieves current password.
'   StrEncrypt(DecryptedString) returns encrypted ascii string.
'   StrDecrypt(EncryptedString_ascii) returns decrypted string.
'   StrEncryptBin(DecryptedString) returns encrypted binary string.
'   StrDecryptBin(EncryptedString_binary) returns decrypted string.
'
' Encrypted ascii string is twice the length of the decrypted string.
' Encrypted ascii string contains low ascii chars from a to p only.
' Encrypted binary string is same length as the decrypted string.
' Encrypted binary string may contain any char including Chr(0).
' Password may contain any ascii char including Chr(0).
' Password is maintained in global variable strPC1Password16.

  Private Const clngHexMax  As Long = &H10
  Private Const clngBytMax  As Long = &H100
  ' Maximum value of unsigned Integer.
  Private Const clngIntMax  As Long = &H10000
  ' clngAscMin defines beginning of a 16 letter range from a to p.
  Private Const clngAscMin  As Long = &H61
  
  Public strPC1Password16   As String * clngHexMax
  
  Private x1a0(9)           As Long
  Private cle(17)           As Long
  Private x1a2              As Long
  
  Private lngInt            As Long
  Private lngRes            As Long
  Private lngTmp            As Long
  
  Private ax                As Long
  Private bx                As Long
  Private cx                As Long
  Private dx                As Long
  Private si                As Long
  Private i                 As Long
  Private c                 As Long
  Private d                 As Long
  Private e                 As Long
  
  Private strEncrypted      As String
  Private strDecrypted      As String

Public Function SetPassword(ByRef strPassword As String) As Integer

  Dim intPasswordLength As Integer
  
  ' Remove leading and trailing spaces from password.
  strPassword = Trim(strPassword)

  ' Set global variable and limit password to fixed length of 16
characters.
  strPC1Password16 = strPassword

  ' Find and return net length of password.
  intPasswordLength = Len(strPassword)
  
  SetPassword = intPasswordLength
  
End Function

Public Function GetPassword() As String

  ' Get global variable strPC1Password16.
  GetPassword = RTrim(strPC1Password16)
  
End Function

Public Function StrEncrypt(ByVal strInput As String) As String

  strDecrypted = strInput
  Call Encrypt(False)
  
  StrEncrypt = strEncrypted

End Function

Public Function StrDecrypt(ByVal strInput As String) As String
  
  strEncrypted = strInput
  Call Decrypt(False)
  
  StrDecrypt = strDecrypted

End Function

Public Function StrEncryptBin(ByVal strInput As String) As String

  strDecrypted = strInput
  Call Encrypt(True)
  
  StrEncryptBin = strEncrypted

End Function

Public Function StrDecryptBin(ByVal strInput As String) As String
  
  strEncrypted = strInput
  Call Decrypt(True)
  
  StrDecryptBin = strDecrypted

End Function

Private Sub Encrypt(ByVal booBinary As Boolean)

  Dim strX  As String
  Dim lngC  As Long
  Dim lngD  As Long
  Dim lngM  As Long
  Dim lngN  As Long
  Dim lngX  As Long

  si = 0
  x1a2 = 0
  i = 0
  
  strX = strDecrypted
  lngX = Len(strX)
  strEncrypted = Space(lngX * (2 - Abs(booBinary)))
  
  For lngN = 1 To clngHexMax
    cle(lngN) = Asc(Mid(strPC1Password16, lngN, 1))
  Next lngN
  
  For lngN = 1 To lngX
    c = Asc(Mid(strX, lngN, 1))
  
    ' Calculate lngInt.
    Call Assemble
  
    lngC = lngInt \ clngBytMax
    lngD = lngInt Mod clngBytMax
    
    For lngM = 1 To clngHexMax
      cle(lngM) = cle(lngM) Xor c
    Next lngM
  
    c = c Xor (lngC Xor lngD)
    
    If booBinary = False Then
      ' Build ascii string.
      d = (c \ clngHexMax) Mod clngHexMax
      e = c Mod clngHexMax
      ' clngAscMin + d gives one letter range from a to p for the 4
high bits of c.
      ' clngAscMin + e gives one letter range from a to p for the 4 low
bits of c.
      ' Perform high speed insertion of encrypted character.
      Mid(strEncrypted, (lngN * 2) - 1, 1) = Chr(clngAscMin + d)
      Mid(strEncrypted, (lngN * 2) - 0, 1) = Chr(clngAscMin + e)
    Else
      ' Build binary string.
      ' Perform high speed insertion of encrypted character.
      Mid(strEncrypted, lngN, 1) = Chr(c)
    End If
  Next lngN
  
End Sub

Private Sub Decrypt(ByVal booBinary As Boolean)

  Dim strX  As String
  Dim lngC  As Long
  Dim lngD  As Long
  Dim lngM  As Long
  Dim lngN  As Long
  Dim lngX  As Long

  si = 0
  x1a2 = 0
  i = 0
  
  strX = strEncrypted
  lngX = Len(strX) \ (2 - Abs(booBinary))
  strDecrypted = Space(lngX)
  
  For lngN = 1 To clngHexMax
    cle(lngN) = Asc(Mid(strPC1Password16, lngN, 1))
  Next lngN
  
  For lngN = 1 To lngX
    If booBinary = False Then
      d = Asc(Mid(strX, (lngN * 2) - 1, 1))
      If d >= clngAscMin Then
        ' Transform the letter to the 4 high bits of c.
        d = d - clngAscMin
        If d < clngHexMax Then
          d = d * clngHexMax
        End If
      End If
      e = Asc(Mid(strX, (lngN * 2) - 0, 1))
      If e >= clngAscMin Then
        ' Transform the letter to the 4 low bits of c.
        e = e - clngAscMin
        If e < clngHexMax Then
          c = d + e
        End If
      End If
    Else
      c = Asc(Mid(strX, lngN, 1))
    End If
    
    ' Calculate lngInt.
    Call Assemble
    
    lngC = (lngInt \ clngBytMax) Mod clngBytMax
    lngD = lngInt Mod clngBytMax
    c = c Xor (lngC Xor lngD)
    
    For lngM = 1 To clngHexMax
      cle(lngM) = cle(lngM) Xor c
    Next lngM
    
    ' Perform high speed insertion of decrypted character.
    Mid(strDecrypted, lngN, 1) = Chr(c)
  Next lngN

End Sub

Private Sub Assemble()

  Dim lngM  As Long
  Dim lngN  As Long
  
  x1a0(0) = ((cle(1) * clngBytMax) + cle(2)) Mod clngIntMax
  Call Code
  lngInt = lngRes
  
  For lngM = 1 To (clngHexMax / 2) - 1
    lngN = lngM * 2
    x1a0(lngM) = x1a0(lngM - 1) Xor ((cle(lngN + 1) * clngBytMax) +
cle(lngN + 2))
    Call Code
    lngInt = lngInt Xor lngRes
  Next lngM
  
  i = 0
  
End Sub

Private Sub Code()

  Const clngKeyB  As Long = &H4E35
  Const clngKeyC  As Long = &H15A
  
  dx = (x1a2 + i) Mod clngIntMax
  ax = x1a0(i)
  cx = clngKeyC
  bx = clngKeyB
  
  lngTmp = ax
  ax = si
  si = lngTmp
  
  lngTmp = ax
  ax = dx
  dx = lngTmp
  
  If (ax <> 0) Then
    ax = ((ax Mod clngIntMax) * (bx Mod clngIntMax)) Mod clngIntMax
  End If
  
  lngTmp = ax
  ax = cx
  cx = lngTmp
  
  If (ax <> 0) Then
    ax = ((ax Mod clngIntMax) * (si Mod clngIntMax)) Mod clngIntMax
    cx = (ax + cx) Mod clngIntMax
  End If
  
  lngTmp = ax
  ax = si
  si = lngTmp
  ax = ((ax Mod clngIntMax) * (bx Mod clngIntMax)) Mod clngIntMax
  dx = (cx + dx) Mod clngIntMax
  
  ax = ax + 1
  
  x1a2 = dx
  x1a0(i) = ax
  
  lngRes = ax Xor dx
  i = i + 1

End Sub


---
>>> JRojas at tnco-inc.com 28-02-2005 17:22:40 >>>
Hello,

I am looking a code snippet that would take in a string and convert it
to a
fixed length encrypted string. As well as a code snippet that would
take the
encrypted string and return the original string.
Preferably in VB or vbscript.

I am trying to create a session-less web application but there are
times
where information needs to be passed from page to page, like someone's
username, that is sensitive and wouldn't want someone either reading
or
sending it themselves. If I can encrypt this string, it would stop
casual
users from sending this data themselves by creating a web page with a
form
and posting it to the web server.

Thanks,
JR




This electronic transmission is strictly confidential to TNCO, Inc.
and
intended solely for the addressee. It may contain information which is
covered by legal, professional, or other privileges. If you are not
the
intended addressee, or someone authorized by the intended addressee to
receive transmissions on behalf of the addressee, you must not retain,
disclose in any form, copy, or take any action in reliance on this
transmission. If you have received this transmission in error, please
notify
the sender as soon as possible and destroy this message. While TNCO,
Inc.
uses virus protection, the recipient should check this email and any
attachments for the presence of viruses. TNCO, Inc. accepts no
liability for
any damage caused by any virus transmitted by this email.
_______________________________________________
dba-Tech mailing list
dba-Tech at databaseadvisors.com 
http://databaseadvisors.com/mailman/listinfo/dba-tech 
Website: http://www.databaseadvisors.com



More information about the dba-Tech mailing list