Encriptando y descifrando una matriz de bytes -- # camp Relacionados El problema

encrypting and decrypting a byte array


1
vote

problema

Español

Tengo las siguientes funciones de utilidad para serializar mis objetos a la matriz de bytes cifrados y también para deserializar desde la matriz de bytes descifrados

  //encryption key public static byte[] Key = new byte[]{0x43, 0x72, 0x6e, 0x6d, 0x54, 0x4d, 0x65,                                       0x94, 0x16, 0x32, 0x44, 0x84, 0x7e, 0x18,                                       0x64, 0x76, 0x6e, 0x63, 0x64, 0x7a, 0x5f,                                       0x84, 0x7f, 0x9a};  //Decrypt byte[] public static byte[] Decrypt(byte[] data) {     MemoryStream ms = new MemoryStream();     Rijndael alg = Rijndael.Create();     alg.Key = Key;     CryptoStream cs = new CryptoStream(ms,     alg.CreateDecryptor(), CryptoStreamMode.Write);     cs.Write(data, 0, data.Length);     cs.Close();     byte[] decryptedData = ms.ToArray();     return decryptedData; }  //Encrypt byte[] public static byte[] Encrypt(byte[] data) {     MemoryStream ms = new MemoryStream();     Rijndael alg = Rijndael.Create();     alg.Key = Key;     CryptoStream cs = new CryptoStream(ms,     alg.CreateEncryptor(), CryptoStreamMode.Write);     cs.Write(data, 0, data.Length);     cs.Close();     byte[] encryptedData = ms.ToArray();     return encryptedData; }  //serialize object to memory stream public static MemoryStream SerializeToStream(object o) {     MemoryStream stream = new MemoryStream();     IFormatter formatter = new BinaryFormatter();     formatter.Serialize(stream, o);     return stream; }  //deserialize object from memory stream public static T DerializeFromStream<T>(MemoryStream memoryStream) where T : new() {     if (memoryStream == null) { return new T(); }     T o;     BinaryFormatter binaryFormatter = new BinaryFormatter();     using (memoryStream)     {         memoryStream.Seek(0, SeekOrigin.Begin);         o = (T)binaryFormatter.Deserialize(memoryStream);     }     return o; }   

y aquí hay una prueba usando las funciones de utilidad anteriores

  //serialize to stream then to byte array var obj = new SomeObject(); var bytes = SerializeToStream(obj).ToArray(); bytes = Encrypt(bytes);  //deserialize to decrypted byte array then to stream then to object var memoryStream = new MemoryStream(); var Decryptedbytearray = Decrypt(bytes); //fille the stream memoryStream.Write(Decryptedbytearray, 0, Decryptedbytearray.Length); //deserialize the object from the stream //it fails here giving an exception saying the binary data is not valid var obj2 = DerializeFromStream<SomeObject>(memoryStream);   

El problema viene cuando deserializa el objeto, vea la última línea comentada, ¿qué estoy haciendo mal?

Original en ingles

i have the following utility functions to Serialize my objects to encrypted byte array and also to deserialize from decrypted byte array

//encryption key public static byte[] Key = new byte[]{0x43, 0x72, 0x6e, 0x6d, 0x54, 0x4d, 0x65,                                       0x94, 0x16, 0x32, 0x44, 0x84, 0x7e, 0x18,                                       0x64, 0x76, 0x6e, 0x63, 0x64, 0x7a, 0x5f,                                       0x84, 0x7f, 0x9a};  //Decrypt byte[] public static byte[] Decrypt(byte[] data) {     MemoryStream ms = new MemoryStream();     Rijndael alg = Rijndael.Create();     alg.Key = Key;     CryptoStream cs = new CryptoStream(ms,     alg.CreateDecryptor(), CryptoStreamMode.Write);     cs.Write(data, 0, data.Length);     cs.Close();     byte[] decryptedData = ms.ToArray();     return decryptedData; }  //Encrypt byte[] public static byte[] Encrypt(byte[] data) {     MemoryStream ms = new MemoryStream();     Rijndael alg = Rijndael.Create();     alg.Key = Key;     CryptoStream cs = new CryptoStream(ms,     alg.CreateEncryptor(), CryptoStreamMode.Write);     cs.Write(data, 0, data.Length);     cs.Close();     byte[] encryptedData = ms.ToArray();     return encryptedData; }  //serialize object to memory stream public static MemoryStream SerializeToStream(object o) {     MemoryStream stream = new MemoryStream();     IFormatter formatter = new BinaryFormatter();     formatter.Serialize(stream, o);     return stream; }  //deserialize object from memory stream public static T DerializeFromStream<T>(MemoryStream memoryStream) where T : new() {     if (memoryStream == null) { return new T(); }     T o;     BinaryFormatter binaryFormatter = new BinaryFormatter();     using (memoryStream)     {         memoryStream.Seek(0, SeekOrigin.Begin);         o = (T)binaryFormatter.Deserialize(memoryStream);     }     return o; } 

and here is a test using the above utility functions

//serialize to stream then to byte array var obj = new SomeObject(); var bytes = SerializeToStream(obj).ToArray(); bytes = Encrypt(bytes);  //deserialize to decrypted byte array then to stream then to object var memoryStream = new MemoryStream(); var Decryptedbytearray = Decrypt(bytes); //fille the stream memoryStream.Write(Decryptedbytearray, 0, Decryptedbytearray.Length); //deserialize the object from the stream //it fails here giving an exception saying the binary data is not valid var obj2 = DerializeFromStream<SomeObject>(memoryStream); 

the problem comes when deserializing the object, see the commented last line, what am i doing wrong?

  
   
   

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Si depura su código, verá que no se descifra correctamente. La razón es que tiene que usar no solo el mismo div2 , pero también el mismo div3 .

de MSDN :

La propiedad IV es configurada automáticamente en un nuevo valor aleatorio siempre que cree una nueva instancia de una de las clases de SymmetricalGorithm o cuando llame manualmente el método GenerateIV. El tamaño de la propiedad IV debe ser la misma que la propiedad BlockSize dividida por 8.

Eche un vistazo a esta pregunta Para obtener detalles sobre cómo crear una clave y una IV de una frase de contraseña.

 

If you debug your code you'll see that it is not decrypting correctly. The reason is that you have to use not only the same key, but also the same IV.

From MSDN:

The IV property is automatically set to a new random value whenever you create a new instance of one of the SymmetricAlgorithm classes or when you manually call the GenerateIV method. The size of the IV property must be the same as the BlockSize property divided by 8.

Take a look at this question for details on how to create a key and a IV from a passphrase.

 
 
0
 
vote

Hay una forma fácil de generar una versión cifrada de una matriz de bytes.

Echa un vistazo a este código Sniped que forma parte de un BAELSLASS seguro, está diseñado para tener acceso limitado a una matriz, este se cifra a nivel de instancia. Al mirarlo, obtendrá la idea de que en realidad cuando cambie la "sal", puede cambiar el alcance con facilidad de que Coge los errores y no los debemos propagar, esto puede considerarse una mala codificación, sin embargo, proporcionar un error que sea tan fácil para que los hackers comprendan cómo pasar por lo que es que está intentando proteger ..., aquí está el código :

  div4  

La clase ProtectedData proviene de un sistema de espacio de nombres. Security.cryptography y se puede encontrar en el Sistema de paquetes de NUGET.SECURITY.CRYPTROPHICA.PROTECTADODATA EN CORE 2.0

 

There is an easy way to generate an encrypted version of a byte array.

Have a look at this code sniped that is part of a secure Baseclass , it is designed to have limited access to a array, this one encrypts at an instance level. When looking at it you will get the idea that actually when you change the "salt" you can change the scope quite easely. I catch the errors and do not propage them, this can be considered bad coding however providing an error makes it so much easyer for hackers to understand how to by pass what ever it is you are trying to protect..., here is the code:

internal class Protected {     private  Byte[] salt = Guid.NewGuid().ToByteArray();      protected byte[] Protect(byte[] data)     {         try         {             return ProtectedData.Protect(data, salt, DataProtectionScope.CurrentUser);         }         catch (CryptographicException)//no reason for hackers to know it failed         { #if DEBUG             throw; #else             return null; #endif         }     }      protected byte[] Unprotect(byte[] data)     {         try         {             return ProtectedData.Unprotect(data, salt, DataProtectionScope.CurrentUser);         }         catch (CryptographicException)//no reason for hackers to know it failed         { #if DEBUG             throw; #else             return null; #endif         }     } } 

The class ProtectedData comes from a namespace System.Security.Cryptography and can be found in NuGet package System.Security.Cryptography.ProtectedData in Core 2.0

 
 

Relacionados problema

701  Cómo convertir decimal a doblarse en C #  ( How to convert decimal to double in c sharp ) 
Quiero usar un Track-Bar para cambiar una opacidad double1 . Este es mi código: decimal trans = trackBar1.Value / 5000; this.Opacity = trans; Cuan...

65  Punto flotante Número de análisis: ¿Hay un algoritmo de captura?  ( Floating point number parsing is there a catch all algorithm ) 
Una de las partes divertidas de la programación multicultural son los formatos de números. Los estadounidenses usan 10,000.50 los alemanes usan 10.000,50...

105  Temporizador confiable en una aplicación de consola  ( Reliable timer in a console application ) 
Soy consciente de que en .NET Hay tres tipos de temporizador (consulte Comparando las clases de temporizador en la biblioteca de clase de Framework ). H...

65  Decodificación T-SQL FUNCIONES EN C # / VB.NET  ( Decoding t sql cast in c vb net ) 
Recientemente, nuestro sitio ha sido desalentado con el resurgimiento de la asprox botnet inyección de SQL Ataque. Sin entrar en detalles, el ataque inten...

107  ¿Cómo obtengo una lista distinta y ordenada de nombres de un DataQ usando LINQ?  ( How do i get a distinct ordered list of names from a datatable using linq ) 
Tengo un DataTable con una columna Name . Quiero generar una colección de los nombres únicos ordenados alfabéticamente. La siguiente consulta ignora la clá...

1563  Calcular el tiempo relativo en C #  ( Calculate relative time in c sharp ) 
Dado un valor específico double16 , ¿cómo mostrar el tiempo relativo, como: hace 2 horas hace 3 días hace un mes ...

1955  ¿Cómo calculo la edad de alguien en función de un cumpleaños tipo DateTime?  ( How do i calculate someones age based on a datetime type birthday ) 
Dado un Form5 que representa el cumpleaños de una persona, ¿cómo calculo su edad en años? ...

141  Llenando un conjunto de datos o un DataTable desde un conjunto de resultados de consulta LINQ  ( Filling a dataset or a datatable from a linq query result set ) 
¿Cómo expone una consulta LINQ como un servicio web de ASMX? Por lo general, desde el nivel de negocios, puedo devolver un double20 998877766220 998877766...

80  ¿Cómo imprimo un documento HTML de un servicio web?  ( How do i print an html document from a web service ) 
Quiero imprimir HTML desde un servicio web C #. El control del navegador web está exagerado, y no funciona bien en un entorno de servicio, ni funciona bien en...

55  Comprimiendo / descomprimiendo carpetas y archivos  ( Compressing decompressing folders files ) 
¿Alguien sabe de una buena manera de comprimir o descomprimir archivos y carpetas en C # rápidamente? Manejo de grandes archivos podría ser necesario. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos