对称密钥解密返回值与字符之间的空格

时间:2015-06-10 19:45:37

标签: c# asp.net sql-server sql-server-2012 encryption-symmetric

我正在使用以下Scaler值函数来解密使用对称密钥加密的数据:

USE [DBNAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[DECRYPTDATA] 
(
    @CipherText NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)
    SELECT @Result = CONVERT(VARCHAR(MAX),DECRYPTBYKEY(@CipherText))
    RETURN @Result
END

我正在使用以下查询来获取数据:

EXEC [dbo].OpenKeys
SELECT ([dbo].DECRYPTDATA([Value])) AS VALUE FROM [Table1] WHERE [UsrId] =2 AND [GroupID] = 44

我在SQL Server 2012 Management Studio中执行了此查询,它只显示解密文本的第一个字母:

enter image description here

当我在C#代码中检查DataTable时,它显示了字符之间的空格:

enter image description here

实际数据必须如下:

╔═══════╗
║ VALUE ║
╠═══════╣
║ 232   ║
║ hgjhg ║
║ 12    ║
║ 53    ║
║ 0     ║
╚═══════╝

这里发生了什么?

更新

我尝试直接插入INSERT INTO Table1([Value]) VALUES([dbo].ENCRYPTISDATA('432')),但是当我获取此行时,它仅显示4。所以我认为问题出在SQL Server端。它是什么我不知道。希望有人能尽快弄明白。我必须在几天内提交这个项目。

我使用的是TripleDES算法。

2 个答案:

答案 0 :(得分:1)

这里似乎有几件事情在发挥作用:

  1. decryptbykey采用varbinary,而不是nvarchar。我猜这里有一些不必要的转换。
  2. 您正在将解密结果转换为varchar,但是从您的函数返回为nvarchar。再次不必要的转换。

答案 1 :(得分:0)

无论此问题的根本原因如何,如果您的原始数据在字符之间不包含空格,那么您可以应用以下快速修复:strWithSpaces=strWithSpaces.Replace(" ", String.Empty);

关于原因:加密前的原始字符串可能包含一些不可打印(即不可见)的字符,这些字符会被编码。我建议在加密前分析原始数据,并使用类似的技术在该阶段删除不必要的chars

希望这可能会有所帮助。