У меня есть шифрование AES для двух столбцов: один из этих столбцов хранится в базе данных SQL Server 2000; другой хранится в базе данных SQL Server 2008.
Поскольку база данных первого столбца (2000 г.) не имеет собственных функций для шифрования/дешифрования, мы решили выполнить логику шифрования на уровне приложения с классами .NET для обоих.
Но поскольку база данных второго столбца (2008 г.) допускает такую функциональность, мы хотели бы сделать миграцию данных с использованием функций базы данных более быстрой, поскольку миграция данных в SQL 2k намного меньше, чем в этой секунде, и она будет длиться дольше. чем 50 часов из-за того, что они сделаны на уровне приложений.
Моя проблема началась в этот момент: используя тот же ключ, я не получил ни того же результата при шифровании значения, ни того же размера результата.
Ниже у нас есть полная логика в обе стороны. Ключ я, конечно, не показываю, но в остальном все то же самое:
private byte[] RijndaelEncrypt(byte[] clearData, byte[] Key)
{
var memoryStream = new MemoryStream();
Rijndael algorithm = Rijndael.Create();
algorithm.Key = Key;
algorithm.IV = InitializationVector;
var criptoStream = new CryptoStream(memoryStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
criptoStream.Write(clearData, 0, clearData.Length);
criptoStream.Close();
byte[] encryptedData = memoryStream.ToArray();
return encryptedData;
}
private byte[] RijndaelDecrypt(byte[] cipherData, byte[] Key)
{
var memoryStream = new MemoryStream();
Rijndael algorithm = Rijndael.Create();
algorithm.Key = Key;
algorithm.IV = InitializationVector;
var criptoStream = new CryptoStream(memoryStream, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
criptoStream.Write(cipherData, 0, cipherData.Length);
criptoStream.Close();
byte[] decryptedData = memoryStream.ToArray();
return decryptedData;
}
Это пример кода SQL:
open symmetric key columnKey decryption by password = N'{pwd!!i_ll_not_show_it_here}'
declare @enc varchar(max)
set @enc = dbo.VarBinarytoBase64(EncryptByKey(Key_GUID('columnKey'), 'blablabla'))
select LEN(@enc), @enc
Этот varbinaryToBase64 — это проверенная функция sql, которую мы используем для преобразования varbinary в тот же формат, который мы используем для хранения строк в приложении .net.
Результат в C#: eg0wgTeR3noWYgvdmpzTKijkdtTsdvnvKzh+uhyN3Lo=
Тот же результат в SQL2k8: AI0zI7D77EmqgTQrdgMBHAEAAACyACXb+P3HvctA0yBduAuwPS4Ah3AB4Dbdj2KBGC1Dk4b8GEbtXs5fINzvusp8FRBknF15Br2xI1CqP0Qb/M4w
Я просто еще не понял, что я делаю неправильно.
У тебя есть идеи?
EDIT: Один момент, который я считаю решающим: у меня есть один вектор инициализации в моем коде C #, 16 байтов. Этот IV не установлен в симметричном ключе SQL, могу ли я это сделать?
Но даже не заполняя IV на C#, я получаю совсем другие результаты, как по содержанию, так и по длине.