[Originariamente su programmers.stackexchange.com con titolo: Puoi crittografare con AES + CBC e cercare i dati crittografati ]
Fondamentalmente, ho intenzione di andare con Advanced Encryption Standard con modalità Cipher-Block Chaining o Cipher Feedback o Output Feedback (non ho ancora deciso). Ogni modalità richiede un vettore di inizializzazione. Il fatto è che voglio rendere la stringa crittografata "ricercabile" in questo modo:
Supponiamo di avere un elenco di tabelle del database insieme a un "nome visualizzato" per ogni tabella. Concettualmente l'elenco sarebbe simile a questo (ho usato {xxx} per indicare la forma crittografata di xxx e [IVx] per indicare un vettore di inizializzazione):
ENC_DISPLAY_NAME | ENC_TABLE_NAME
------------------------ | -----------------
[IV1]{John's table} | [IV2]{TABLE_3574}
[IV3]{Eric's list} | [IV4]{TABLE_3100}
|
[IV5]{Darren's projects} | [IV6]{TABLE_2823}
[IV7]{Paul's contacts} | [IV8]{TABLE_5843}
Ora supponiamo che voglio consentire una ricerca su ENC_DISPLAY_NAME. (Le ricerche di uguaglianza sono tutto ciò che è necessario). Devo avere un modo per sapere quale vettore di inizializzazione è usato sul nome visualizzato che voglio trovare.
Penso che dovrei calcolare un hash a 128 bit (forse un CRC) del nome visualizzato, e usarlo come IV per calcolare la stringa crittografata. Cioè, se voglio memorizzare "i progetti di Darren", dovrei fare qualcosa del genere:
AESKey key = ...;
String str = "Darren's projects";
CRCType crc = ComputeCRC(str);
BinaryString enc = crc.ToBinaryString ( ).Concat
(EncryptWithAESandCBC(str, key, (IVType)crc));
INSERT INTO MY_TABLE(ENC_DISPLAY_NAME,ENC_TABLE_NAME) VALUES(enc, ...);
Se invece desidero cercare la stringa, esegui gli stessi passaggi tranne l'ultimo e poi SELECT * FROM MY_TABLE WHERE ENC_DISPLAY_NAME=enc
.
Questo è già stato provato? Ci sono dei rischi (di sicurezza)?
[Domande correlate: Calcola la chiave di crittografia AES con il testo in chiaro e il testo cifrato? ]