1

我正在玩Asymmetric Encryption and Decryption,但我不明白当我尝试解密值时得到的结果。DECRYPTBYASYMKEY()未返回预期值

为什么会这样:

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

更新:我是哑巴,0x47726567Gregvarbinary转换时。

回答

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(最大值)或nvarchar(最大)。如果你试图

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

那就错了,因为你的公司的Greg'的输入是一个varchar。

2

我认为0x47726567Greg(ASCII)。

1

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