Има няколко неща, които бих разгледал:
-
Уверете се, че обикновеният текст е идентичен по съдържание и кодиране. IIRC, потоците по подразбиране са UTF-8, докато ако вашият
VarBinaryToBase64
функцията вземе параметър nvarchar, той ще бъде Unicode. -
Уверете се, че и двата алгоритъма за криптиране използват един и същ размер на блока. В SQL вие определяте алгоритъма, когато извиквате
CREATE SYMMETRIC KEY
. Ако не посочите алгоритъм, той използва AES256. В .NET с помощта наRijndaelManaged
, смятам, че размерът на блока по подразбиране е 128, но можете да го зададете на 256 (не можете, ако използватеAes
клас). -
Последното нещо, което бих търсил, е как SQL Server се справя с инициализационните вектори, както споменахте във вашата променена публикация. Искам да кажа, че използва
authenticator
параметър за това, но това е странно предположение.
РЕДАКТИРАНЕ
Бях далеч. Като се има предвид това, което открих, не можете да използвате .NET клас за декриптиране на текст, криптиран от вграденото криптиране на SQL Server, защото SQL Server добавя куп слуз към това, което се криптира, включително вектор за произволна инициализация. От книгата на Майкъл Коул „Pro T-SQL 2005 Programmer's Guide“ (въпреки че 2008 прави това по същия начин):