(was: [Can you encrypt with AES+CBC and search the encrypted data?][1]) Basically, I'm going to go with Advanced Encryption Standard with either Cipher-Block Chaining mode or Cipher Feedback mode or Output Feedback mode (I haven't decided yet). Each mode requires an initialization vector. The thing is that I want to make the encrypted string "searchable" like this: Suppose I have a list of database tables together with a "display name" for each table. Conceptually the list would look like this (I've used {xxx} to mean the encrypted form of xxx, and [IVx] to mean an initialization vector): 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} Now suppose that I want to allow a search on ENC_DISPLAY_NAME. (Equality searches are all that are needed.) I need to have some way of knowing what initialization vector is used on the display name I want to find. I think that I should compute a 128-bit hash (maybe a CRC) of the display name, and use that as the IV to compute the encrypted string. That is, if I want to store "Darren's projects", I should do something like this: 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, ...); If I want to search for the string instead, do the same steps except the last, and then `SELECT * FROM MY_TABLE WHERE ENC_DISPLAY_NAME=enc`. Has this been tried before? Are there any (security) risks? [1]: http://programmers.stackexchange.com/questions/83874/when-using-aes-and-cbc-can-the-iv-be-a-hash-of-the-plaintext