Шифровать с C#, как SQL Сервер EncryptByPassPhrase? - PullRequest
0 голосов
/ 27 января 2020

После ответа на этот вопрос я смог воссоздать функцию DecryptByPassPhrase, равную SQL. Сейчас я пытаюсь выполнить функцию EncryptByPassPhrase.

У нас есть другая версия SQL на другом сервере, которую нельзя обновить до одной и той же версии одновременно, поэтому мы хотим создать нашу функцию c# ( с SQL CLR).

Мне нужно кодировать с помощью SHA1 (например, SQL 2012), поскольку SQL на другом сервере может быть еще не обновлен до 2017 года

Здесь мой 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, поэтому я попытался добавить их, но безуспешно

...