Sigue el problema del cifrado...

28/07/2003 - 16:25 por Geni | Informe spam
Pues eso, aún no puedo detectar mi error para los métodos de cifrado que
estoy utilizando, el código es el siguiente
public string CifrarCadena(string Cadena)
{
MemoryStream fout = new MemoryStream(Cadena.Lenght);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform encript = des.CreateEncryptor();
CryptoStream cs = new CryptoStream(fout, encript,
CryptoStreamMode.Write);
cs.Write(ASCIIEncoding.ASCII.GetBytes(Cadena), 0, Cadena.Length);

return this.ByteArrayToString(fout.GetBuffer());
}

al parecer funciona bien, pero el decifrado jamás se produce, me envía un
error al leer CryptoStream. El código de ese método es este..

public string DecifrarCadena(string Cadena)
{
MemoryStream fout = new
MemoryStream(ASCIIEncoding.ASCII.GetBytes(Cadena));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform desencript = des.CreateDecryptor();
CryptoStream cs = new CryptoStream(fout, desencript,
CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs); // Error //
return sr.ReadToEnd();
}

alguien tiene alguna idea u otra forma de realizar este tipo de
cifradomuchas gracias.

Preguntas similare

Leer las respuestas

#1 Hernan Foffani
29/07/2003 - 13:16 | Informe spam
Pues eso, aún no puedo detectar mi error para los métodos
de cifrado que estoy utilizando, el código es el siguiente

alguien tiene alguna idea u otra forma de realizar este
tipo de cifrado



siento no haber respondido antes. el codigo tenia varios
errores: faltaba definir la clave y el vector de
inicializacion!, tenia problemas con MemoryStream (ahora
ya lo manejo mejor), etc.

va el codigo de Cifra.cs, que incluye una clase de prueba
para ser usada con csUnit.

a mi me resulto un buen ejercicio. espero que a ti te
sirva.
suerte!

-Hernan

using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using csUnit;

namespace foros {
/// <remarks>
/// clase para cifrar cadenas. usa el algoritmo DES
///
/// clave vector de inicializacion ambos de 64 bits.
/// </remarks>
public class Cifra {
// Usamos DES
private DESCryptoServiceProvider algoritmo = new
DESCryptoServiceProvider();

// clave
private byte[] m_Key = {1,2,3,4,5,6,7,8 };

// vector de inicializacion
private byte[] m_IV = {8,7,6,5,4,3,2,1};

/// <summary>
/// CifrarCadena recibe un string en claro y
devuelve otro
/// cifrado.
/// </summary>
public string CifrarCadena(string cadenaEnClaro) {
MemoryStream memStream = new MemoryStream
(cadenaEnClaro.Length * 2);
CryptoStream cifStream = new CryptoStream
(memStream,
algoritmo.CreateEncryptor(m_Key, m_IV),
CryptoStreamMode.Write);
byte[] bytesEnClaro =
Encoding.UTF8.GetBytes(cadenaEnClaro);
byte[] bytesEncriptados = null;
string textoEncriptado = null;

cifStream.Write(bytesEnClaro, 0,
bytesEnClaro.Length);
cifStream.FlushFinalBlock();

bytesEncriptados = new byte[memStream.Length];

memStream.Position = 0;
memStream.Read(bytesEncriptados, 0, (int)
memStream.Length);

cifStream.Close();

textoEncriptado = Convert.ToBase64String
(bytesEncriptados);
return textoEncriptado;
}

/// <summary>
/// DecifrarCadena recibe un string cifrado y
devuelve otro en claro.
/// </summary>
public string DecifrarCadena(string
cadenaEncriptada) {
byte[] bytesEncriptados =
Convert.FromBase64String(cadenaEncriptada);
byte[] bytesEnClaro = null;
string cadenaEnClaro = null;
MemoryStream memStream = new MemoryStream
(cadenaEncriptada.Length);
CryptoStream cifStream = new CryptoStream
(memStream,
algoritmo.CreateDecryptor(m_Key, m_IV),
CryptoStreamMode.Write);

cifStream.Write(bytesEncriptados, 0,
bytesEncriptados.Length);
cifStream.FlushFinalBlock();

bytesEnClaro = new byte[memStream.Length];

memStream.Position = 0;
memStream.Read(bytesEnClaro, 0, (int)
memStream.Length);

cifStream.Close();

cadenaEnClaro = Encoding.UTF8.GetString
(bytesEnClaro);
return cadenaEnClaro;
}
}


[TestFixture]
public class UnitTest {

Cifra c;

[SetUp]
public void CreaCrifra() {
c = new Cifra();
}

[Test]
public void PruebaCifra() {
string s = "Geni esta cifrando";
Assert.Equals(c.DecifrarCadena(c.CifrarCadena
(s)), s);
}
}
}

- fin Cifra.cs
Respuesta Responder a este mensaje
#2 Hernan Foffani
29/07/2003 - 13:47 | Informe spam
agrego codigo mejorado. queda claro ahora que los
problemas del hilo de conversacion previo eran:
- usar la codificacion correcta al pasar de string a
byte[]
- las claves y vectores de inicializacion: tienen que
tener las longitudes especificadas por el algoritmo
usado.
- no usar GetBuffer() en MemoryStream: usar ToArray()
- cerrar el CryptoStream o aplicar FlushFinalBlock()
antes de leer el contenido del MemoryStream.

saludos,
-Hernan


public string CifrarCadena(string cadenaEnClaro) {
byte[] bytesEnClaro = Encoding.UTF8.GetBytes
(cadenaEnClaro);

MemoryStream memStream = new MemoryStream
(cadenaEnClaro.Length * 2);
CryptoStream cifStream = new CryptoStream(memStream,
algoritmo.CreateEncryptor(m_Key, m_IV),
CryptoStreamMode.Write);

cifStream.Write(bytesEnClaro, 0, bytesEnClaro.Length);
cifStream.Close();

return Convert.ToBase64String(memStream.ToArray());
}

public string DecifrarCadena(string cadenaEncriptada) {
byte[] bytesEncriptados =
Convert.FromBase64String(cadenaEncriptada);

MemoryStream memStream = new MemoryStream
(cadenaEncriptada.Length);
CryptoStream cifStream = new CryptoStream(memStream,
algoritmo.CreateDecryptor(m_Key, m_IV),
CryptoStreamMode.Write);

cifStream.Write(bytesEncriptados, 0,
bytesEncriptados.Length);
cifStream.Close();

return Encoding.UTF8.GetString(memStream.ToArray());
}
Respuesta Responder a este mensaje
#3 Geni
30/07/2003 - 01:15 | Informe spam
muchisimas gracias por tu tiempo Hernan, me ha funcionado de maravilla...te
lo agradezco enormemente...
un abrazo.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida