У меня есть шифрование 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 + P3HvctA0yBduAuwPS4Ah3AB4Dbdj2KBGC1Dk4b8GEbtXs5fINzvib5 * FFRF2F2RFFF
Я просто еще не понял, что я делаю неправильно.
У вас есть идеи?
РЕДАКТИРОВАТЬ: Одна вещь, я думаю, имеет решающее значение: у меня есть один вектор инициализации на мой код C #, 16 байтов. Этот IV не установлен на симметричном ключе SQL, могу ли я это сделать?
Но даже не заполняя IV в C #, я получаю очень разные результаты, как по содержанию, так и по длине.