Replicar T-SQL DecryptByPassPhrase en C #

Quiero crear una class C # para descifrar una matriz de bytes cifrada utilizando CryptByPassPhrase de T-SQL. (Sí, sé que podría descifrar dentro de SQL Server, pero lo que necesito es poder encriptar / desencriptar tanto en el nivel de la database como en el nivel intermedio de manera equivalente).

Entiendo que EncryptByPassPhrase y DecryptByPassPhrase de SQL Server usan el algorithm de key simétrica TripleDES. Sin embargo, no tengo claro qué debe hacer el IV para simular la criptología de SQL Server. Puedo cifrar / descifrar usando la class TripleDESCryptoServiceProvider , pero no puedo encontrar la implementación correcta de la key y IV para replicar lo que está haciendo SQL Server.

¿Alguien ha hecho algo similar? ¡Gracias!

(1) Use C # para generar un par key / iv: TripleDESCryptoServiceProvider cp = new TripleDESCryptoServiceProvider ();

MemoryStream m = new MemoryStream(Convert.FromBase64String(Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(plainText)))); CryptoStream cs = new CryptoStream(m, cp.CreateEncryptor(cp.Key, cp.IV), CryptoStreamMode.Read); cp.Key = Convert.FromBase64String("BeaYzNeHfDb27OFYgaYHUd5HUJE2aZyI"); cp.IV = Convert.FromBase64String("T/ENF5G4sCA="); string key = Convert.ToBase64String(cp.Key); string iv = Convert.ToBase64String(cp.IV); // write key/iv to a file here 

(2) Una vez que tenemos eso, use un código como este para codificar

  TripleDESCryptoServiceProvider cp = new TripleDESCryptoServiceProvider(); MemoryStream m = new MemoryStream(Convert.FromBase64String(Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(plainText)))); CryptoStream cs = new CryptoStream(m, cp.CreateEncryptor(cp.Key, cp.IV), CryptoStreamMode.Read); cp.Key = Convert.FromBase64String("the key value from above"); cp.IV = Convert.FromBase64String("the iv value from above"); string key = Convert.ToBase64String(cp.Key); string iv = Convert.ToBase64String(cp.IV); List<byte> r = new List<byte>(); int x = 0; for (; x > -1; ) { x = cs.ReadByte(); if (x > -1) r.Add((byte)x); } byte[] y = r.ToArray(); string cypherText = Convert.ToBase64String(y); 

(3) Luego para decodificar:

  TripleDESCryptoServiceProvider cp = new TripleDESCryptoServiceProvider(); MemoryStream m = new MemoryStream(Convert.FromBase64String(cypherText)); cp.Key = Convert.FromBase64String("the key value from above"); cp.IV = Convert.FromBase64String("the iv value from above"); CryptoStream cs = new CryptoStream(m, cp.CreateDecryptor(cp.Key, cp.IV), CryptoStreamMode.Read); StreamReader reader = new StreamReader(cs); string plainText = reader.ReadToEnd(); 
Intereting Posts