visual studio encriptacion cipher c# encryption rijndael

studio - encriptacion aes c#



cifrado de rijndael: solo se descifra una parte de la cadena (3)

Aqui tienes:

string s = "The brown fox jumped over the green frog"; string k = "urieurut"; byte[] enc = EncryptString(s, k); string dec = DecryptString(enc, k);

No puede intentar interpretar un grupo de bytes cifrados como una cadena Unicode. Guárdelos como bytes. La versión descifrada se puede convertir de nuevo a cadena.

También tenga en cuenta la eliminación de objetos desechables a continuación. Podría terminar con algunos recursos retenidos demasiado tiempo o fugas si no los libera adecuadamente con el using() o el Dispose() .

public static byte[] EncryptString(string stringToEncrypt, string encryptionKey) { UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); using (RijndaelManaged RMCrypto = new RijndaelManaged()) using (MemoryStream ms = new MemoryStream()) using (ICryptoTransform encryptor = RMCrypto.CreateEncryptor(key, key)) using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { byte[] encryptedString = UE.GetBytes(stringToEncrypt); cs.Write(encryptedString, 0, encryptedString.Length); cs.FlushFinalBlock(); return ms.ToArray(); } } public static string DecryptString(byte[] stringToDecrypt, string encryptionKey) { UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); using (RijndaelManaged RMCrypto = new RijndaelManaged()) using (MemoryStream ms = new MemoryStream()) using (ICryptoTransform decryptor = RMCrypto.CreateDecryptor(key, key)) using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { cs.Write(stringToDecrypt, 0, stringToDecrypt.Length); cs.FlushFinalBlock(); return UE.GetString(ms.ToArray()); } }

Solo una parte de la cadena se está descifrando, creo que tiene que ver con mi codificación.

Esto es lo que sucede:

string s = "The brown fox jumped over the green frog"; string k = "urieurut"; string enc = EncryptString(s, k); string dec = DecryptString(enc, k);

El RESULTADO es este: el zorro marrón juϼ 㴘 裴 ≸ ≸ ≸ r th≸ g≸een rana

public static string EncryptString(string stringToEncrypt, string encryptionKey) { string encrypted = String.Empty; UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); RijndaelManaged RMCrypto = new RijndaelManaged(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); byte[] encryptedString = UE.GetBytes(stringToEncrypt); cs.Write(encryptedString, 0, encryptedString.Length); cs.FlushFinalBlock(); cs.Close(); encrypted = UE.GetString(ms.ToArray()); return encrypted; } public static string DecryptString(string stringToDecrypt, string encryptionKey) { string decrypted = String.Empty; UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); byte[] data = UE.GetBytes(stringToDecrypt); RijndaelManaged RMCrypto = new RijndaelManaged(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); cs.Close(); decrypted = UE.GetString(ms.ToArray()); return decrypted; }


No estoy seguro acerca de su fragmento de código específico, pero Jeff Atwood hizo una buena biblioteca pequeña que he usado antes:

http://www.codeproject.com/KB/security/SimpleEncryption.aspx

Vale la pena verlo, ya que simplifica mucho el proceso de cifrado de las cosas, de hecho tuve que ingresar a C # ya que no había un puerto disponible cuando lo vi. Sin embargo, ahora hay un puerto C # (en la sección de comentarios).


Resolví mi problema usando la cadena base64 para el cifrado. Puedo ver otras opciones, pero solo necesitaba estos métodos para una pequeña cantidad de datos, aquí está el código final:

public static string EncryptString(string stringToEncrypt, string encryptionKey) { string encrypted = String.Empty; byte[] key = Encoding.Unicode.GetBytes(encryptionKey); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.Padding = PaddingMode.PKCS7; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt); cs.Write(encryptedString, 0, encryptedString.Length); cs.FlushFinalBlock(); cs.Close(); //encrypted = Encoding.ASCII.GetString(ms.ToArray()); return Convert.ToBase64String(ms.ToArray()); } public static string DecryptString(string stringToDecrypt, string encryptionKey) { string decrypted = String.Empty; byte[] key = Encoding.Unicode.GetBytes(encryptionKey); byte[] data = Convert.FromBase64String(stringToDecrypt); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.Padding = PaddingMode.PKCS7; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); cs.Close(); decrypted = Encoding.ASCII.GetString(ms.ToArray()); return decrypted; }