在C#中复制T-SQL DecryptByPassPhrase [英] Replicate T-SQL DecryptByPassPhrase in C#

查看:179
本文介绍了在C#中复制T-SQL DecryptByPassPhrase的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆