|
|
|
|
|
 |
 |
 |
|
Foros MUGPERU
|
 |
 |
| 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. |
|
|
|
ActiveForums 3.7
|
 |
 |
 |
 |
|
|
|
|
|
|
|
|
|