T-SQL 中的 AES 加密和 c# 解密

AES encrypt in c# decrypt in T-SQL

我写了下面的代码来解密一些敏感数据,在大多数情况下我需要使用 T-SQL 查询数据,而我无法解密被这段代码加密的数据.所以我的问题是我如何在 T-SQL 中编写一个函数,其工作方式与在 C# 中的工作方式相同,我将在存储过程中使用它。

提前致谢

加密函数:

public static string Encrypt(string text)
    {
        if (string.IsNullOrEmpty(EncryptionKey))
            return string.Empty;
        if (string.IsNullOrEmpty(text))
            return string.Empty;
        var clearBytes = Encoding.Unicode.GetBytes(text);
        using (var encryptor = Aes.Create())
        {
            var pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[]
            {
                0x49,
                0x76,
                0x61,
                0x6e,
                0x20,
                0x4d,
                0x65,
                0x64,
                0x76,
                0x65,
                0x64,
                0x65,
                0x76
            });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                }
                text = Convert.ToBase64String(ms.ToArray());
            }
        }
        return text;
    }

解密函数:

public static string Decrypt(string text)
    {
        if (string.IsNullOrEmpty(EncryptionKey))
            return string.Empty;
        if (string.IsNullOrEmpty(text))
            return string.Empty;
        var cipherBytes = Convert.FromBase64String(text);
        using (var encryptor = Aes.Create())
        {
            var pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[]
            {
                0x49,
                0x76,
                0x61,
                0x6e,
                0x20,
                0x4d,
                0x65,
                0x64,
                0x76,
                0x65,
                0x64,
                0x65,
                0x76
            });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                }
                text = Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return text;
    }

您可以在 SQL 服务器中创建 CLR UDF。

有关详细信息,请参阅以下链接:

http://blog.sqlauthority.com/2008/10/19/sql-server-introduction-to-clr-simple-example-of-clr-stored-procedure/

https://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.90).aspx