Boletín mugperu Digital - Julio 2009!
  Search 
Monday, May 21, 2012 ..:: Foros de Discusión ::.. Register  Login
Foros MUGPERU Minimize
Subject: Encriptación de un MemoryStream
Prev Next
You are not authorized to post a reply.

Author Messages
raulmercadox
Posts:0

12/05/2005 10:59 AM  

Hola amigos, tengo un problema con una encriptación con un stream MemoryStream, cuando lo hago con FileStream funciona, pero cuando lo hago con MemoryStream, no funciona, he probado con el metodo write del objeto CryptoStream, tambien lo he probado con el método Write del objeto que pertenece a la clase MemoryStream, pero tampoco encripta. Se los agradezco de antemano.
El codigo es el siguiente:

UnicodeEncoding uniEncoding = new UnicodeEncoding();

// Crea una nueva instancia de la clase RijndaelManaged

// y encripta la secuencia

RijndaelManaged RMCrypto = new RijndaelManaged();

byte[] Key = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16};

byte[] IV = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16};

foreach (string word in text)

{

//char[] charWord = word.ToCharArray();

byte[] stringWord = uniEncoding.GetBytes(word);

//MemoryStream memStream = new MemoryStream(word.Length*2);

MemoryStream memStream = new MemoryStream();

//memStream.Write(stringWord,0,stringWord.Length);

// Crea un CryptoStream, pasa a este el MemoryStream, y encripta este con la clase Rijndael

CryptoStream CryptStream = new CryptoStream(memStream,RMCrypto.CreateEncryptor(Key,IV),CryptoStreamMode.Write);

StreamWriter SWriter = new StreamWriter(CryptStream);

//SWriter.Write(charWord,0,word.Length);

memStream.Write(stringWord,0,stringWord.Length);

CryptStream.Close();

memStream.Close();

}

 

Gracias

Raul Mercado.

richie_crazy57
Posts:203

12/05/2005 12:48 PM  

Raúl, he probado tu código. Hay algo que quiero saber, cuando llamas al bucle

foreach (string word in text)

aparece un mensaje de error ya que, por defecto, el recorrido con la palabra clave foreach en una variable de tipo string itera sobre valores de tipo char.

Si lo que quieres es iterar sobre las palabras de tu texto (que es lo más lógico, dado que tu variable de iteración se llama word) deberías utilizar

foreach (string word in text.Split(' '))

En cuanto al hecho de que no encripta, una vez resuelto el tema de la iteración, el programita no tiene ningún problema, se ejecuta normalmente. Sin embargo, me parece que dado el hecho de que creas los MemoryStreams como variables locales dentro del bucle, tales MemoryStreams  se eliminan con cada iteración. Entonces, como no veo que guardes el contenido de los MemoryStreams  en ningún otro lugar, es imposible que fuera del bucle veassu contenido. quizás estoy equivocado. Si es así, por favor hazmelo saber. Espero que te haya servio de algo mi ayuda. Bye.

Я!©ђ!Є ©Я∆ZΨ

raulmercadox
Posts:0

13/05/2005 08:13 AM  

Hola Richie.
Lo que pasa es que al enviar el fragmento de código estaba obviando la declaración del método. Este recibe como parámetro un array de string[] que ya han sido previamente separados de una cadena mas larga. Te explico un poco cual es mi problema con la encriptación. El objeto de tipo MemoryStream se debe inicializar con un tamaño predeterminado en el constructor o en su defecto si es que no se inicializa este tamaño se asigna dinámicamente. Encontre un ejemplo de como encriptar en msdn library, pero lo hacen con un NetworkStream. Este NetworkStream es un parámetro en el constructor del objeto de tipo CryptoStream. El punto es que este constructor acepta como parámetro cualquier objeto del tipo Stream: NetworkStream, FileStream o MemoryStream. El detalle aquí es que para escribir en el NetworkStream utilizan el método Write de un objeto del tipo StreamWriter, pero el MemoryStream no necesita de este objeto de tipo StreamWriter, puesto que ya viene con un método Write (¿o si lo necesita?). Te vuelvo a enviar el código un poquito mas completo que el anterior :) Gracias de antemano

internal static string[] Encrypt(string[] text)
{
   try
   {
   UnicodeEncoding uniEncoding = new UnicodeEncoding();
   RijndaelManaged RMCrypto = new RijndaelManaged();
   byte[] Key ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16};
   byte[] IV = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16};

   foreach
(string word in
text)
   {
      byte[] stringWord = uniEncoding.GetBytes(word);

      MemoryStream memStream = newlt;/FONT> MemoryStream();

      CryptoStream CryptStream = new CryptoStream(memStream,RMCrypto.CreateEncryptor(Key,IV),CryptoStreamMode.Write);

      StreamWriter SWriter = new StreamWriter(CryptStream);

      memStream.Write(stringWord,0,stringWord.Length); 
      // En este momento si hacemos una inspeccion a memStream, ya deberia estar encriptado pero nada :(

      CryptStream.Close();

      memStream.Close();

   }
}

richie_crazy57
Posts:203

13/05/2005 10:39 AM  

Raúl:

Por la declaración de tu código es fácil saber que lo que deseas es retornar el arreglo de las palabras encriptadas, no es cierto?

Bueno, para empezar, ya que el código que has enviado ahora no tiene ni la llave de cierre del método ni la instrucción returns ni el catch del try, supongo que más adelante, en ese mismo método intentas obtener lo que cargaste en memoria, no? Sin embargo, como ya te lo mencioné antes, creo que tus MemoryStreams son locales al bucle foreach, y por tanto, a pesar de que realiza satisfactoriamente la encriptación de las palabras, los MemoryStreams (y su contenido, las palabras encriptadas) "mueren" con cada iteración del bucle.

Bueno, de todas maneras, encontré un ejemplo en la documentación del método CreateEncryptor de la clase RijndaelManaged que me fue muy útil como base. Lo he modificado y aquí está la solución que encontré. Aquí te entrego el código completo para tu método Encrypt:

internal static string[] Encrypt(string[] text)

{

// Esta variable almacenará el arreglo de cadenas encriptadas

string[] encryptedStrings = new string[text.Length]

try

{

UnicodeEncoding uniEncoding = new UnicodeEncoding();

RijndaelManaged RMCrypto = new RijndaelManaged();

byte[] Key ={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16};

byte[] IV = {0x01,0x02,0x03,0x04,0x05,0x06,x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16};

// índice de las palabras en el arreglo

// de ayuda para el bucle de asignación de las cadenas encriptadas

int index = 0;

foreach (string word in text)

{

// Esta variable almacenará el arreglo de bytes originales

byte[] stringWord = uniEncoding.GetBytes(word);

// Esta variable almacenará el arreglo de bytes encriptados

byte[] encryptedBytes;

MemoryStream memStream = new MemoryStream();

CryptoStream CryptStream = new CryptoStream(memStream,RMCrypto.CreateEncryptor(Key,IV),CryptoStreamMode.Write);

// aquí es que se va a encriptar la palabra

// pero ojo, se utiliza el write del CryptoStream asociado al MemoryStream

// no directamente el MemoryStream

CryptStream.Write(stringWord,0,stringWord.Length);

CryptStream.FlushFinalBlock();

// En este momento se llena el arreglo de los bytes encriptados

encryptedBytes = memStream.ToArray();

CryptStream.Close();

memStream.Close();

// utilizas el codificador unicode para obtener la cadena a partir el arreglo de bytes obtenido

encryptedStrings[index] = uniEncoding.GetString(encryptedBytes);

// Incrementas el índice para la próxima iteración

index++;

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message,"Error", MessageBoxButtons.OK,MessageBoxIcon.Error);

}

// retornas el arreglo de cadenas encriptadas

return encryptedStrings;

}

Le puse una excepción simple en el catch, pero creo que tú utilizas otra (IOException puede ser). Pero de verdad espero haberte ayudado, y si aún tienes problemas, sigue posteando nomás. Yo estaré atento. Ok? Bye y suerte.

Ah, lo olvidaba, si deseas te puedo mandar el proyecto con el cual lo he probado, quizás te sirva de algo. Si es así, escríbeme a mi correo (richie_crazy57@hotmail.com)

Я!©ђ!Є ©Я∆ZΨ

You are not authorized to post a reply.
Forums > Temas de Interés > General .NET > Encriptación de un MemoryStream



ActiveForums 3.7
        
Copyright 2001-2012 MUGPERU   Terms Of Use  Privacy Statement