Replica T-SQL DecryptByPassPhrase in C #

Voglio creare una class C # per decodificare un array di byte crittografato utilizzando EncryptByPassPhrase di T-SQL. (Sì, so che potrei decifrare in SQL Server, ma ciò di cui ho bisogno è poter essere in grado di crittografare / decifrare sia nel livello del database che nel livello intermedio).

Comprendo che EncryptByPassPhrase e DecryptByPassPhrase di SQL Server utilizzano l’algoritmo della chiave simmetrica TripleDES. Non è chiaro per me, però, cosa debba fare la IV per simulare la crittologia di SQL Server. Posso crittografare / decodificare utilizzando la class TripleDESCryptoServiceProvider , ma non riesco a trovare l’implementazione corretta di chiave e IV per replicare ciò che sta facendo SQL Server.

Qualcuno ha fatto qualcosa di simile? Grazie!

(1) Utilizzare C # per generare una coppia chiave / 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 volta ottenuto ciò, utilizzare un codice come questo per codificare

  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 r = new List(); 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) Quindi per decodificare:

  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();