Newsgroup: it.comp.appl.access
Titolo: ricerca di un valore criptato

Ciao a tutti,
ho bisogno di questo tipo di aiuto:
ho una tabella con un campo contenente valori criptati (per motivi di
privacy)
ho bisogno, al momento di inserire un nuovo valore in questo campo, di
una routine che controlli che lo stesso valore non sia già presente
per evitare duplicati della stessa persona
Io ho agito in questo modo:
-nella maschera di ricerca inserisco il valore in chiaro, da codice
viene criptato e tramite funzione dlookup viene ricercato nel campo
- se lo trova tutto ok, il problema é ke non riesco a farmi dire che
non viene trovato, ovvero...
valore = DLookup("[IDricovero]", "anagrafica", "[cartellaclinica]=" &
Chr(34) & cartellacriptato& Chr(34))
if valore = null then msgbox "valore non trovato"
...non funziona
Avete idea di cosa succeda ?

 Avete idea di cosa succeda ?
Fa sapere...
Ciao,
Max

On 14 Mag, 20:39, "Massimo Piubelli"

mi cospargo il capo di cenere e vi bacio le mani,
sempre servo vostro sono
naturalmente così funziona
grazie infinite

scusate ma ho bisogno di tornare sull'argomento,
infatti avevo provato (e grazie al suggerimento di Massimo ero
riuscito) la ricerca di un valore in chiaro, invece non ho successo
con la ricerca di un valore criptato.
Pur scrivendo in chiaro 2 parole uguali, una volta criptate poi non
vengono trovate
Mi era sembrato di leggere da qualche parte che la criptazione avviene
anche grazie a fattori casuali, puo' essere questo il problema ?
Ovvero la stessa stringa può essere cifrata in 2 modi differenti ?

 Ovvero la stessa stringa può essere cifrata in 2 modi differenti ?
in teoria no, una stringa criptata può (in certi casi) rappresentare n stringhe non criptate, il contrario non dovrebbe succedere.
Ciao,
Max

Innanzitutto grazie per la risposta,
dunque la funzione encypt di Dima Mnushkin l'ho scaricata dal
sitocomune, mentre io , su aggiornamento del campo ho scritto:
Private Sub cartellaclinica_AfterUpdate()
    'questa routine si attiva appena finito di scrivere il numero di
cartella clinica
    'serve a cercare il numero di cartella clinica nei precedenti
record,
    'se viene trovato viene annullata l'operazione
    Dim cartella As String
    Dim criptcartella As String
    Dim idrecord
    Dim messaggio
    'cripta il valore della cartella appena immesso
    cartella = Me.cartellaclinica.Value
    criptacartella = encrypt(cartella, True)
    'cerca il valore
    idrecord = DLookup("idanagrafica", "anagrafica", "cartellaclinica
=" & Chr(34) & criptacartella & Chr(34))
    If IsNull(idrecord) Then Exit Sub 'se non lo  trova esce
    messaggio = MsgBox("questo numero di cartella clinicina é già
presente nell'ID")
    ecc...

questa é la funzione:
Const PASSWORD_KEY = "QuEStA ChIaVe12345PassAT"
'modificare la chiave con una a piacimento
'================================================
' Function: encrypt
'
' Purpose:  To encrypt or decrypt a string using
'           a predefined key value stored as
'           the constant PASSWORD_KEY.  The same
'           string encrypted twice won't always
'           look the same because the function
'           chooses a random starting position
'           within the key to encrypt values.
'
' Call:     gResult = encryt("Hello World", true)
'
' In:       strFull -   String containing the
'                       text to encrypt/decrypt
'
'           fEncrypt -  Boolean set to TRUE to
'                       encrypt the string, FALSE
'                       to decrypt it.
'
' Out:      none
'
' Returns:  String -    The encrypted/decrypted
'                       value if successful, ""
'                       otherwise
'
' History:  98/06/10 created by Dima Mnushkin
'
'================================================
Public Function encrypt(strFull As String, _
                   fEncrypt As Boolean) As String
On Error GoTo Err_encrypt
Dim intInputPos As Integer
Dim intPassKeyPos As Integer
Dim strOutput As String
Dim intTemp As Integer
Dim strStartingPos As String
If strFull = "" Then GoTo Exit_encrypt
' Encrypt a value
If fEncrypt Then
  ' Initialize the random function
  Randomize
  ' Determine the starting position to use in
  ' the encryption string
  intPassKeyPos = Int(Len(PASSWORD_KEY) * _
                          Rnd + 1)
  ' Encrypt the starting position used in
  ' preparation to storing it in the middle of
  ' the encrypted result
  intTemp = intPassKeyPos + _
            Asc(Left(PASSWORD_KEY, 1))
  If intTemp > 255 Then intTemp = intTemp - 255
  strStartingPos = Chr(intTemp)
  ' Encrypt the full string
  For intInputPos = 1 To Len(strFull)
    intPassKeyPos = intPassKeyPos + 1
    ' Wrap to the beginning of the key if we have
    ' have used up the last character.
    If intPassKeyPos > Len(PASSWORD_KEY) Then
      intPassKeyPos = 1
    End If
    ' Add the value of the character to be
    ' encrypted to the value of the character
    ' stored at the current position in the key
    intTemp = Asc(Mid(strFull, intInputPos, 1) _
                 ) + Asc(Mid(PASSWORD_KEY, _
                             intPassKeyPos, 1))
    If intTemp > 255 Then intTemp = intTemp - 255
    ' If we are at middle of the result string,
    ' insert our encrypted starting position so
    ' we can decrypt this string later.
    If CInt(Len(strFull) / 2) + 1 = intInputPos _
       Then strOutput = strOutput & strStartingPos
    strOutput = strOutput & Chr(intTemp)
  Next intInputPos
' Decrypt a value
Else
  ' Retrieve the encrypted starting position from
  ' the middle of the string to be decrypted
  intPassKeyPos = Asc(Mid(strFull, _
    CInt((Len(strFull) - 1) / 2) + 1, 1)) - _
    Asc(Left(PASSWORD_KEY, 1))
  If intPassKeyPos < 0 Then _
    intPassKeyPos = intPassKeyPos + 255
  ' Decrypt the full string
  For intInputPos = 1 To Len(strFull)
    intPassKeyPos = intPassKeyPos + 1
    If intPassKeyPos > Len(PASSWORD_KEY) Then _
      intPassKeyPos = 1
    ' Decrypt each character by subtracting the
    ' value of the corresponding character stored
    ' in the key.
    intTemp = Asc(Mid(strFull, intInputPos, 1)) - _
      Asc(Mid(PASSWORD_KEY, intPassKeyPos, 1))
    If intTemp <= 0 Then intTemp = intTemp + 255
    ' If we are looking at the middle character,
    ' ignore it since its the encrypted starting
    ' position.
    If intInputPos = CInt((Len(strFull) - 1) / 2) + _
       1 Then
      intPassKeyPos = intPassKeyPos - 1
    Else
      strOutput = strOutput & Chr(intTemp)
    End If
  Next intInputPos
End If
encrypt = strOutput
Exit_encrypt:
  Exit Function
Err_encrypt:
  encrypt = ""
  MsgBox Error
  Resume Exit_encrypt
End Function


Il meccanismo che ho adottato consiste nell'inserire la stringa in
chiaro ne campo, da codice la stringa inserita viene criptata e poi la
stringa criptata viene cercata nella tabella con dlookup
facendo ulteriori prove ho scoperto che scrivendo la stessa stringa
più volte, a volte riconosce una stringa già presente e a volte no, ho
in effetti controllato la tabella in cui sono archiviate le stringhe
cifrate ed pur avendo scritto sempre la stessa cosa le stringhe
cifrate differiscono l'una dall'altra


Non serviva neanche fare ulteriori prove
dalla documentazione della funzione che hai mandato...
'The same
'           string encrypted twice won't always
'           look the same because the function
'           chooses a random starting position
'           within the key to encrypt values.
Ciao,
Max

ecco dove l'avevo letto ;-)
Grazie ancora di tutto