像SQL Server EncryptByPassPhrase一样从C#加密吗?

问题描述 投票:0回答:1

遵循此question的答案后,我能够重新创建SQL的DecryptByPassPhrase函数。现在,我正在尝试执行EncryptByPassPhrase函数。

我们在不同的服务器上有不同的SQL版本,不能同时升级到同一版本,因此我们要创建c#函数(使用SQL CLR)。

由于其他服务器上的SQL可能尚未升级到2017,因此我需要使用SHA1进行编码(例如SQL 2012),>

这里是我的c#,该函数已编译,但是我无法使用其他c#函数对其进行解密(这恰恰是另一个问题的答案的功能)

        int keySize = 16;

        var cryptoAlgo = TripleDES.Create();
        cryptoAlgo.Padding = PaddingMode.PKCS7;
        cryptoAlgo.Mode = CipherMode.CBC;

        cryptoAlgo.GenerateIV(); //cryptoAlgo.IV = StringToByteArray(value.Substring(8, 16));
        //cryptoAlgo.IV = StringToByteArray("7854E155CEE338D5");
        var valueInByte = Encoding.Unicode.GetBytes(value); //UTF8Encoding.UTF8.GetBytes(value); //encrypted = StringToByteArray(value.Substring(24));


        byte[] passwordBytes = Encoding.Unicode.GetBytes(password);
        var hashAlgo = SHA1.Create();
        hashAlgo.TransformFinalBlock(passwordBytes, 0, passwordBytes.Length);
        cryptoAlgo.Key = hashAlgo.Hash.Take(keySize).ToArray();

        byte[] encrypted = cryptoAlgo.CreateEncryptor().TransformFinalBlock(valueInByte, 0, valueInByte.Length);

        //byte[] encryptedData = encrypted.Skip(8).ToArray();
        //bool isUtf16 = (Array.IndexOf(encryptedData, (byte)0) != -1);
        //string encryptedText = (isUtf16 ? Encoding.Unicode.GetString(encryptedData) : Encoding.UTF8.GetString(encryptedData));

        return new SqlString(encryptedText);
        //return new SqlString(encryptedText);
        //return Convert.ToBase64String(encrypted, 0, encrypted.Length);
        //return Convert.ToBase64String(encryptedData, 0, encryptedData.Length);
        //return "0x01000000" + Convert.ToBase64String(cryptoAlgo.IV, 0, cryptoAlgo.IV.Length) + Convert.ToBase64String(encrypted, 0, encrypted.Length);
        //return "0x01000000" + Convert.ToBase64String(encryptedData, 0, encryptedData.Length);

我尝试过很多不同的回报(它们都在评论中)。我注意到SQL返回“ 0x01000000”,我猜接下来的16个字符是IV,所以我尝试添加它们,但是没有运气

按照这个问题的答案,我能够重新创建SQL的DecryptByPassPhrase函数。现在,我正在尝试执行EncryptByPassPhrase函数。我们在...

c# sql sql-server encryption 3des
1个回答
0
投票

具有类似的要求,请注意,仅加密数据是不够的,您的最终字节数组应按以下结构进行构造:

© www.soinside.com 2019 - 2024. All rights reserved.