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 

Produce 0x47726567? Я ожидал, что это будет Greg.

UPDATE: я тупой, 0x47726567 является Greg при преобразовании из varbinary.

ответ

3

Правильно - когда вы зашифровываете что-то, оно рассматривается как массив байтов и возвращается как таковое. 0x47 - G, 72 - r и т. Д.

Если вы изучите документацию для DecryptByAsmKey, вы увидите, что тип возврата является varbinary с максимальным размером 8000 байт. Вы также заметите преобразование в примере.

Так что, если вы шифрования и дешифрования строк вы должны преобразовать как так

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!')); 

было бы неправильно, так как ваш ввод «Грега» является варчаром.

2

0 думаю, 0x47726567 есть Greg (в ASCII).

1

Все функции шифрования возвращают двоичные значения. Вам нужно будет отдать результат как varchar.

Смежные вопросы