jueves, 14 de septiembre de 2017

VBA Access. Módulo de clase clsCrypt. Encriptar y Desencriptar texto con RC4. Crypt, Decrypt.

Option Compare Database
Option Explicit

'https://stackoverflow.com/questions/7025644/vb6-encrypt-text-using-password

Public Function Crypt(ByVal sValue As String, sKey As String) As String
On Error GoTo error
    Crypt = ToHexDump(CryptRC4(sValue, sKey))

Exit Function
error:
    Crypt = sValue
    Debug.Print Err.Description
End Function

Public Function DeCrypt(ByVal sValue As String, sKey As String) As String
On Error GoTo error
    DeCrypt = CryptRC4(FromHexDump(sValue), sKey)

Exit Function
error:
    DeCrypt = sValue
    Debug.Print Err.Description
End Function

Private Function CryptRC4(sText As String, sKey As String) As String
    Dim baS(0 To 255) As Byte
    Dim baK(0 To 255) As Byte
    Dim bytSwap     As Byte
    Dim lI          As Long
    Dim lJ          As Long
    Dim lIdx        As Long

    For lIdx = 0 To 255
        baS(lIdx) = lIdx
        baK(lIdx) = Asc(Mid$(sKey, 1 + (lIdx Mod Len(sKey)), 1))
    Next
    For lI = 0 To 255
        lJ = (lJ + baS(lI) + baK(lI)) Mod 256
        bytSwap = baS(lI)
        baS(lI) = baS(lJ)
        baS(lJ) = bytSwap
    Next
    lI = 0
    lJ = 0
    For lIdx = 1 To Len(sText)
        lI = (lI + 1) Mod 256
        lJ = (lJ + baS(lI)) Mod 256
        bytSwap = baS(lI)
        baS(lI) = baS(lJ)
        baS(lJ) = bytSwap
        CryptRC4 = CryptRC4 & Chr$((pvCryptXor(baS((CLng(baS(lI)) + baS(lJ)) Mod 256), Asc(Mid$(sText, lIdx, 1)))))
    Next
End Function

Private Function pvCryptXor(ByVal lI As Long, ByVal lJ As Long) As Long
    If lI = lJ Then
        pvCryptXor = lJ
    Else
        pvCryptXor = lI Xor lJ
    End If
End Function

Private Function ToHexDump(sText As String) As String
    Dim lIdx            As Long

    For lIdx = 1 To Len(sText)
        ToHexDump = ToHexDump & Right$("0" & Hex(Asc(Mid(sText, lIdx, 1))), 2)
    Next
End Function

Private Function FromHexDump(sText As String) As String
    Dim lIdx            As Long

    For lIdx = 1 To Len(sText) Step 2
        FromHexDump = FromHexDump & Chr$(CLng("&H" & Mid(sText, lIdx, 2)))
    Next
End Function

1 comentario:

  1. Hola, encontre estas rutinas para encriptar Password,
    Alguien sabe que parametros pasar a la funcion DeCrypt?
    Necesito saber las claves de los usuarios de uan base Access con seguridad por usuarios, desde ya muchas gracias, Jaime

    ResponderEliminar

VBA Access. Redondeo de números decimales con el método medio redondeo. Alternativa a la función Round (bankers round)

 Private Function Redondeo(ByVal Numero As Variant, ByVal Decimales As Integer) As Double     'Aplica método medio redondeo (half round ...