在C#中复制T-SQL DecryptByPassPhrase [英] Replicate T-SQL DecryptByPassPhrase in C#
问题描述
我想创建一个C#类来解密使用T-SQL的EncryptByPassPhrase加密的字节数组。 (是的,我知道我可以在SQL Server中进行解密,但是我需要的是能够在数据库层和中间层之间进行加密/解密。)
<我知道SQL Server的EncryptByPassPhrase和DecryptByPassPhrase使用了TripleDES对称密钥算法。不过,我不清楚,IV应该如何模拟SQL Server的密码学。我可以使用 TripleDESCryptoServiceProvider 类加密/解密,但我可以' t找到正确的key和IV的实现来复制SQL Server的工作。
有没有人做过类似的事情?谢谢!
(1)使用C#生成一个键/ 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);
//在这里写一个文件
(2)一旦我们有了,使用这样的代码来编码
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(上面的键值);
cp.IV = Convert.FromBase64String(上面的iv值);
string key = Convert.ToBase64String(cp.Key);
string iv = Convert.ToBase64String(cp.IV);
列表< byte> r = new List< byte>();
int x = 0; (; x> -1;)
{
x = cs.ReadByte();
if(x> -1)
r.Add((byte)x);
}
byte [] y = r.ToArray();
string cypherText = Convert.ToBase64String(y);
(3)然后解码:
TripleDESCryptoServiceProvider cp = new TripleDESCryptoServiceProvider();
MemoryStream m = new MemoryStream(Convert.FromBase64String(cypherText));
cp.Key = Convert.FromBase64String(上面的键值);
cp.IV = Convert.FromBase64String(上面的iv值);
CryptoStream cs = new CryptoStream(m,cp.CreateDecryptor(cp.Key,cp.IV),CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cs);
string plainText = reader.ReadToEnd();
I wnat to create a C# class to decrypt a byte array encrypted using T-SQL's EncryptByPassPhrase. (Yes, I know I could decrypt within SQL Server, but what I need is to be able to encrypt/decrypt within both the database tier and in the middle tier equivalently.)
I understand that SQL Server's EncryptByPassPhrase and DecryptByPassPhrase use the TripleDES symmetric key algorithm. It's not clear to me, though, what the IV should to simulate SQL Server's cryptology. I can encrypt/decrypt using the TripleDESCryptoServiceProvider class, but I can't find the correct implementation of key and IV to replicate what SQL Server is doing.
Has anyone done something similar? Thanks!
(1) Use C# to generate a key/iv pair: 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) Once we have that, use code like this to encode
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) Then to decode:
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();
这篇关于在C#中复制T-SQL DecryptByPassPhrase的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!