encrypt desencriptar decrypt c# md5 hash

desencriptar - md5 c# encrypt decrypt



¿Una alternativa más rápida a MD5? (6)

Espero que esté buscando una coincidencia MD5 solo si el tamaño del archivo ya coincide.

Otra optimización es hacer una suma de comprobación rápida del primer 1K (o algún otro número arbitrario, pero razonablemente pequeño) y asegurarse de que coincidan antes de trabajar todo el archivo.

Por supuesto, todo esto supone que solo está buscando una decisión de coincidencia / nominación para un archivo en particular.

Estoy trabajando en un programa que busca unidades enteras para un archivo determinado. Por el momento, calculo un hash MD5 para el archivo conocido y luego escaneo todos los archivos recursivamente, buscando una coincidencia.

El único problema es que MD5 es extremadamente lento en archivos grandes. ¿Existe una alternativa más rápida que pueda usar, manteniendo una probabilidad muy pequeña de falsos positivos?

Todo el código está en C #.

Gracias.

Actualizar

He leído que incluso MD5 puede ser bastante rápido y que la E / S del disco debería ser el factor limitante. Eso me lleva a creer que mi código podría no ser óptimo. ¿Hay algún problema con este enfoque?

MD5 md5 = MD5.Create(); StringBuilder sb = new StringBuilder(); try { using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read)) { foreach (byte b in md5.ComputeHash(fs)) sb.Append(b.ToString("X2")); } return sb.ToString(); } catch (Exception) { return ""; }


Hay un pequeño problema con el uso de MD5 para comparar archivos: hay pares conocidos de archivos que son diferentes pero tienen el mismo MD5.

Esto significa que puede usar MD5 para saber si los archivos son diferentes (si el MD5 es diferente, los archivos deben ser diferentes), pero no puede usar MD5 para decir si los archivos son iguales (si los archivos son iguales, el MD5 debe ser lo mismo, pero si el MD5 es igual, los archivos pueden o no ser iguales).

Debería utilizar una función hash que aún no se ha roto (como SHA-1), o (como se mencionó en @SoapBox) usar MD5 solo como una forma rápida de encontrar candidatos para una comparación más profunda.

Referencias


Primero considere cuál es realmente su cuello de botella: ¿la función hash en sí o más bien una velocidad de acceso al disco? Si está delimitado por un disco, cambiar el algoritmo hash no le dará mucho. Según su descripción, insinúo que siempre está escaneando todo el disco para encontrar una coincidencia: considere construir primero el índice y luego solo haga coincidir un hash dado con el índice, esto será mucho más rápido.


acabo de leer el archivo linealmente? Parece bastante inútil leer el archivo completo, calcular un hash md5 y luego comparar el hash.

Leer el archivo secuencialmente, unos pocos bytes a la vez, le permitirá descartar la gran mayoría de los archivos después de leer, digamos, 4 bytes. Y ahorrará todos los gastos generales de procesamiento al computar una función de hashing que no le da nada en su caso.

Si ya tenía los valores hash para todos los archivos en el disco, tendría sentido compararlos, pero si tiene que calcularlos sobre la marcha, simplemente no parece haber ninguna ventaja para el hashing.

¿Me estoy perdiendo de algo? ¿Qué te compra hashing en este caso?


Independientemente de los requisitos criptográficos, existe la posibilidad de una colisión hash, por lo que no se puede utilizar ninguna función hash para garantizar que dos archivos sean idénticos.

Hace un tiempo escribí un código similar el cual pude ejecutar bastante rápido indexando primero todos los archivos y descartándolos con un tamaño diferente. Luego se realizó una comparación rápida de hash (en una parte de cada archivo) en las entradas restantes (se comprobó que la comparación de bytes para este paso es menos útil; muchos tipos de archivos tienen encabezados comunes que tienen bytes idénticos al principio del archivo). Todos los archivos que quedaron después de esta etapa se verificaron utilizando MD5, y finalmente una comparación de bytes del archivo completo si el MD5 coincidía, solo para garantizar que el contenido fuera el mismo.


Use MD5CryptoServiceProvider y BufferedStream

using (FileStream stream = File.OpenRead(filePath)) { using (var bufferedStream = new BufferedStream(stream, 1024 * 32)) { var sha = new MD5CryptoServiceProvider(); byte[] checksum = sha.ComputeHash(bufferedStream); return BitConverter.ToString(checksum).Replace("-", String.Empty); } }