对称密钥解密返回字符之间带有 space 的值

Symmetric Key Decryption returning values with space between characters

我正在使用以下 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 中执行了这个查询,它只显示解密文本的第一个字母:

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

实际数据应该是这样的:

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

这里发生了什么?

更新

我尝试像 INSERT INTO Table1([Value]) VALUES([dbo].ENCRYPTISDATA('432')) 那样直接插入,但是当我获取该行时它只显示 4。所以我认为问题出在 SQL 服务器端。那是什么我不知道。希望有人能尽快弄清楚。过几天就要交这个项目了

我正在使用 TripleDES 算法。

不管这个问题的根本原因是什么,如果您的原始数据不包含字符之间的空格,那么您可以应用快速修复,例如:strWithSpaces=strWithSpaces.Replace(" ", String.Empty);

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

希望这可能有所帮助。

这里似乎有几件事在起作用:

  1. decryptbykey 采用 varbinary,而不是 nvarchar。我猜那里正在进行一些不需要的转换。
  2. 您正在将解密结果转换为 varchar,但作为 nvarchar 从您的函数返回。又一次不需要的转换。