遵循此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函数。我们在...
具有类似的要求,请注意,仅加密数据是不够的,您的最终字节数组应按以下结构进行构造: