2

语境:

  • 数据存储在 SQL Server 中。某些字段使用 EncryptWithPassPhrase 加密

update my_table set my_field = EncryptByPassPhrase('012345678901234567890123','some value')

  • 使用 NHibernate 获取数据。使用 Interceptor 解码加密数据

    public static string Decrypt(byte[] toDecryptArray, string key)
    {
        byte[] keyArray;
    
        keyArray = UTF8Encoding.UTF8.GetBytes(key);
    
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
    
        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
    
        return UTF8Encoding.UTF8.GetString(resultArray);
    }
    

它无法cTransform.TransformFinalBlock说“要解密的数据长度无效”。

我的代码有什么问题?数据使用相同的密钥 ( 012345678901234567980123) 加密/解密。

4

2 回答 2

1

我没有发现如何通过 C# 代码解密使用 T-SQL 函数EncryptByPassPhrase加密的内容。

但是 SQL Server 2005 允许您创建 C# 程序集并将其加载到 SQL Server 中,然后构建存储过程或函数或您的 C# 方法。因此,我使用应用程序和 SQL Server 之间的共享代码创建了“我的” EncryptByPassPhrase函数,这样我就可以在双方进行加密/解密。

于 2011-11-24T22:14:29.670 回答
0

文档中提到了密码:

“nvarchar、char、varchar、binary、varbinary 或 nchar 类型的变量,其中包含用于生成对称密钥的密码。”

http://msdn.microsoft.com/en-us/library/ms190357.aspx

所以你不能在 C# 中解密它的原因是你需要使用派生密钥,而不是密码本身。不过,我不知道您是如何得出密钥的。

于 2013-03-04T19:15:56.007 回答