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進行轉換。