Mam szyfrowanie AES wykonywane na dwóch kolumnach: jedna z tych kolumn jest przechowywana w bazie danych SQL Server ; drugi jest przechowywany w bazie danych SQL Server .Jak uzyskać zgodność między szyfrowaniem AES a SQL2k8?
Ponieważ baza danych pierwszej kolumny (2000) nie ma natywnej funkcjonalności do szyfrowania/odszyfrowywania, zdecydowaliśmy się na logikę kryptografii na poziomie aplikacji, z klasami .NET, dla obu.
Jednak jako że baza danych drugiej kolumny (2008) pozwala na tego rodzaju funkcjonalność, chcielibyśmy, aby migracja danych za pomocą funkcji bazy danych była szybsza, ponieważ migracja danych w SQL 2k jest znacznie mniejsza niż ta druga i potrwa dłużej niż 50 godzin, ponieważ jest wykonywany na poziomie aplikacji.
Mój problem rozpoczął się w tym momencie: używając tego samego klucza, nie osiągnąłem tego samego wyniku podczas szyfrowania wartości, ani tego samego rozmiaru wyniku.
Poniżej mamy pełną logikę w obie strony .. Oczywiście ja nie wykazujące klucz, ale wszystko inne jest takie samo:
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;
}
To jest przykładowy kod 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
To varbinaryToBase64 to przetestowana funkcja sql, której używamy do konwertowania varbinary do tego samego formatu, którego używamy do przechowywania ciągów w aplikacji .net.
Wynik w C# jest: eg0wgTeR3noWYgvdmpzTKijkdtTsdvnvKzh + uhyN3Lo =
Taki sam wynik w SQL2k8 jest: AI0zI7D77EmqgTQrdgMBHAEAAACyACXb + P3HvctA0yBduAuwPS4Ah3AB4Dbdj2KBGC1Dk4b8GEbtXs5fINzvusp8FRBknF15Br2xI1CqP0Qb/M4W
po prostu jeszcze nie dostać to, co robię źle.
Czy masz jakieś pomysły?
EDIT: Jeden punkt myślę, że ma kluczowe znaczenie: Mam jeden wektor inicjujący w moim kodu C#, 16 bajtów. Ta IV nie jest ustawiona na klucz symetryczny SQL, czy mógłbym to zrobić?
Ale nawet nie wypełniając IV w C#, otrzymuję bardzo różne wyniki, zarówno pod względem treści, jak i długości.
Czy jest coś w dokumentacji, która stwierdza, że dwa algorytmy szyfrowania są w rzeczywistości takie same? – Joe
mówią, że oba są AES, prawda? Myślałem, że to wystarczy, aby zapewnić pewne współdziałanie .. –