[Originalmente en programmers.stackexchange.com con título: ¿Puede cifrar con AES + CBC y buscar los datos cifrados ]
Básicamente, voy a utilizar el Estándar de cifrado avanzado con el modo de encadenamiento de bloques de cifrado o el modo de retroalimentación de cifrado o el modo de realimentación de salida (aún no lo he decidido). Cada modo requiere un vector de inicialización. La cosa es que quiero hacer que la cadena encriptada se pueda "buscar" de esta manera:
Supongamos que tengo una lista de tablas de base de datos junto con un "nombre para mostrar" para cada tabla. Conceptualmente, la lista se vería así (he usado {xxx} para significar la forma cifrada de xxx, y [IVx] para significar un vector de inicialización):
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}
Ahora suponga que quiero permitir una búsqueda en ENC_DISPLAY_NAME. (Las búsquedas de igualdad son todo lo que se necesita.) Necesito tener alguna forma de saber qué vector de inicialización se usa en el nombre de visualización que quiero encontrar.
Creo que debería calcular un hash de 128 bits (tal vez un CRC) del nombre para mostrar, y usarlo como IV para calcular la cadena cifrada. Es decir, si quiero almacenar los "proyectos de Darren", debería hacer algo como esto:
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, ...);
Si quiero buscar la cadena en su lugar, sigue los mismos pasos excepto el último, y luego SELECT * FROM MY_TABLE WHERE ENC_DISPLAY_NAME=enc
.
¿Se ha intentado esto antes? ¿Hay algún riesgo (seguridad)?
[Pregunta relacionada: Compute ¿La clave de cifrado AES dada el texto simple y su texto cifrado? ]