Descifrar AES en SQL Anywhere 16 encriptado en C # y viceversa

Tengo esta paz de código que encripta cosas usando AES, para ser más preciso algorithm de Rijndael para imitar ( http://dcx.sybase.com/index.html#sa160/en/dbreference/encrypt-function.html ) el comportamiento de SQL Anywhere 16, en aras de ejemplos, las keys de simplicidad son falsas:

var Key = Encoding.ASCII.GetBytes("1234567812345678"); var IV = Encoding.ASCII.GetBytes("1234567812345678"); var text = "stuff"; string encrypted; var aes = new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, BlockSize = 128, KeySize = 128, Key = Key, IV = IV }; using (var encryptor = aes.CreateEncryptor()) { var tmp = Encoding.ASCII.GetBytes(text); encrypted = Convert.ToBase64String(encryptor.TransformFinalBlock(tmp, 0, tmp.Length)); } Console.WriteLine("Encrypted text: " + encrypted); 

Y el resultado que obtengo: do3BgGEeCWS5 + mruUU1Czg == nXnrIX9m4zCxupbPsw3zsg ==

Descifrarlo en SQL Anywhere 16:

 select cast(decrypt(base64_decode('do3BgGEeCWS5+mruUU1Czg=='), '1234567812345678', 'AES(format=RAW;padding=PKCS5)', '1234567812345678') as varchar) 

Obtengo este resultado: cosas cosas

Por lo que casi trabajos, comparando en hex es 0x73007400750066006600 en lugar de 0x7374756666 . Además, si descifro el mismo text en C # (la fuente del desencryptionr se puede encontrar a continuación), También tengo los mismos espacios, ¿qué estoy haciendo mal?

También lo probé de otra manera, encryption en SQL Anywhere:

 select base64_encode(encrypt('stuff', '1234567812345678', 'AES(format=RAW;padding=PKCS5)', '1234567812345678')) 

Tengo esta línea: nXnrIX9m4zCxupbPsw3zsg ==

Intentando descifrar en C # usando el mismo procedimiento:

 string decrypted; using (var decryptor = aes.CreateDecryptor()) { var tmp = System.Convert.FromBase64String(encrypted); decrypted = Encoding.ASCII.GetString(decryptor.TransformFinalBlock(tmp, 0, tmp.Length)); }; Console.WriteLine("Decrypted text: " + decrypted); 

Obtengo el resultado correcto: cosas sin espacios innecesarios.

Entonces funciona con un inconveniente espejo, ¿alguna idea de dónde son esos los espacios extra?

Actualización: Error en var tmp = Encoding.Unicode.GetBytes (text); línea, cambió Unicode a ASCII.

Si está utilizando SQL Anywhere versión 16.0 o posterior, puede hacerlo utilizando la opción 'format = raw' de la function de desencryption . Si está utilizando una versión anterior, la function de desencryption no podrá descifrar los datos encryptions fuera del server de la database.

Actualización: desde que actualizaste tu pregunta, me ocuparé de eso también. Ejecuté el desencryption en el server de SQL Anywhere, y los datos que salen tienen los NULL incorporados, lo que significa que los datos que están encriptados ya contienen los NULL incorporados. No soy un chico C #, así que no puedo decirte con security, pero sospecho que var text = "stuff"; almacena los datos en UTF-16.

Divulgación completa: trabajo para SAP en ingeniería de SQL Anywhere.

Intereting Posts