Me estoy volviendo loco con este. Pasa todo el día y todavía no puede entender lo que está pasando. Estoy usando el cifrado AES256CBC tanto en .Net como en JavaScript. Por alguna razón, obtuve resultados diferentes, a pesar de que estoy usando la misma clave y iv. Mis códigos son:
JavaScript:
function convertStringToArrayBuffer(str) { var length = str.length; var bytes = new Uint8Array(length); for(var i = 0; i < length; i++) { bytes[i] = str.charCodeAt(i); } return bytes; } var keyB64 ="sy/d1Ddy/9K3p8x6pWMq2P8Qw2ftUjkkrAA7xFC7aK8="; var viB64 = "t8eI2F+QmlUBWZJVIlTX6Q=="; var dataToEnc = "Test123!" let dataInBytes = convertStringToArrayBuffer(dataToEnc); let key = window.atob(keyB64); let iv = window.atob(viB64); console.log(key); console.log(iv); window.crypto.subtle.importKey("raw", convertStringToArrayBuffer(key).buffer, {name: "AES-CBC", length: 256}, false, ["encrypt"]).then(function(key){ console.log(key); window.crypto.subtle.encrypt({name: "AES-CBC", iv: convertStringToArrayBuffer(iv).buffer}, key, dataInBytes.buffer).then(function(encrypted){ console.log(encrypted); }); });este produce
.Red:
public static void Test() { var dataToEnc = "Test123!"; var keyB64 = "sy/d1Ddy/9K3p8x6pWMq2P8Qw2ftUjkkrAA7xFC7aK8="; var viB64 = "t8eI2F+QmlUBWZJVIlTX6Q=="; var key = Convert.FromBase64String(keyB64); var iv = Convert.FromBase64String(viB64); var data = Encoding.UTF8.GetBytes(dataToEnc); byte[] encrypted = null; using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv; ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(data); } encrypted = msEncrypt.ToArray(); } } } }este produce
Creo que es algo trivial, pero no puedo encontrar esto. Agradezco cualquier pista aquí.
Si alguien más tiene este problema, el comentario de @Topaco es el camino correcto, lo pegaré a continuación.
El error está en el código C#. Tienes que usar swEncrypt.Write(dataToEnc) en lugar de swEncrypt.Write(data). La sobrecarga que está utilizando actualmente ejecuta implícitamente data.ToString()