Fuerza bruta. Esto es Adler32, que no he implementado antes, y no me molesté en las pruebas, así que es bastante probable que lo haya estropeado. Sin embargo, no esperaría que una versión corregida corriera significativamente más lenta, a menos que haya hecho algo colosalmente errado.
Esto supone que el valor de 32 bits suma de comprobación se escribe en el archivo ascendente hacia la izquierda (no he encontrado un punto fijo con ella big endian):
#include <iostream>
#include <stdint.h>
#include <iomanip>
const int modulus = 65521;
void checkAllAdlers(uint32_t sofar, int depth, uint32_t a, uint32_t b) {
if (depth == 4) {
if ((b << 16) + a == sofar) {
std::cout << "Got a fixed point: 0x" <<
std::hex << std::setw(8) << std::setfill('0') <<
sofar << "\n";
}
return;
}
for (uint32_t i = 0; i < 256; ++i) {
uint32_t newa = a + i;
if (newa >= modulus) newa -= modulus;
uint32_t newb = b + a;
if (newb >= modulus) newb -= modulus;
checkAllAdlers(sofar + (i << (depth*8)), depth + 1, newa, newb);
}
return;
}
int main() {
checkAllAdlers(0, 0, 1, 0);
}
Salida:
$ g++ adler32fp.cpp -o adler32fp -O3 && time ./adler32fp
Got a fixed point: 0x03fb01fe
real 0m31.215s
user 0m30.326s
sys 0m0.015s
[Editar: varios errores solucionados, no tengo ninguna confianza en la exactitud de este código ;-) De todos modos, tienes la idea: una suma de control de 32 bits que utiliza cada byte de entrada solo una vez es muy barato para la fuerza bruta. Los checksums generalmente están diseñados para ser rápidos de computar, mientras que los hashes son usualmente mucho más lentos, a pesar de que tienen efectos superficialmente similares. Si su suma de comprobación fue "2 rondas de Adler32" (lo que significa que la suma de comprobación objetivo fue el resultado de calcular la suma de comprobación y luego calcular la suma de comprobación de esa suma de comprobación) entonces mi enfoque recursivo no ayudaría tanto, habría proporcionalmente menos en común entre las entradas con un prefijo común. MD5 tiene 4 rondas, SHA-512 tiene 80.]
Hay muchas formas de calcular las sumas de comprobación, y ciertamente no existe un algoritmo universal para hacer que este tipo de archivo sea independiente del algoritmo de cálculo de la suma de comprobación (además de ridículamente bruto) forzar prueba y error). ¿Se ha especificado el algoritmo CS? –
¿Cómo se debe calcular la suma de comprobación? SHA1, MD5, o cualquier cosa que elija, porque si puedo seleccionar el algoritmo de suma de comprobación, esto es bastante trivial. –
básicamente está buscando una función de punto fijo, donde f (x) = x. –