DECRYPTBYASYMKEY()未返回预期值

时间:2012-01-07 07:36:40

标签: sql-server sql-server-2008 encryption encryption-asymmetric

我正在玩Asymmetric Encryption and Decryption,但我不明白我在尝试解密数值时得到的结果。

为什么这样:

CREATE ASYMMETRIC KEY myasymkey 
    WITH ALGORITHM = RSA_2048 
    ENCRYPTION BY PASSWORD = '123pass!'; 
GO

SELECT DECRYPTBYASYMKEY(ASYMKEY_ID('myasymkey'), 
    EncryptByAsymKey(AsymKey_ID('myasymkey'), 'Greg'), 
    N'123pass!');
GO

制作0x47726567?我原以为Greg

更新:从0x47726567转换后,我很笨,Gregvarbinary

3 个答案:

答案 0 :(得分:3)

这是正确的 - 当你加密一些东西时,它被视为一个字节数组,并按原样返回。 0x47是G,72是r等

如果查看DecryptByAsmKey的文档,您会注意到返回类型为varbinary,最大大小为8,000字节。您还会注意到示例中的转换。

因此,如果您要加密和解密字符串,则必须进行转换

SELECT CONVERT(varchar(max),DECRYPTBYASYMKEY(ASYMKEY_ID('myasymkey'), 
    EncryptByAsymKey(AsymKey_ID('myasymkey'), 
    'Greg'), 
    N'123pass!'));

另请注意,您需要确保根据输入转换为varchar(max)或nvarchar(max)。如果你试过

SELECT CONVERT(nvarchar(max),DECRYPTBYASYMKEY(ASYMKEY_ID('myasymkey'), 
    EncryptByAsymKey(AsymKey_ID('myasymkey'), 
    'Greg'), 
    N'123pass!'));

这是错误的,因为您输入的'Greg'是varchar。

答案 1 :(得分:2)

我认为0x47726567Greg(用ASCII格式)。

答案 2 :(得分:1)

所有加密函数都返回varbinary值。您必须将结果转换为varchar。