Aquí está mi problema. Actualmente estoy intentando implementar algunos estándares de criptografía en PHP por razones de compatibilidad. El que estoy trabajando ahora es SHA256 y SHA512. Ambos son estándares razonablemente sencillos, y no estoy teniendo problemas con eso.Operaciones bit a bit en cadenas grandes en PHP
Sin embargo, SHA512 requiere operaciones bit a bit en enteros de 64 bits. Como PHP puede tener solo enteros de 32 bits (con la compilación), eso me deja con un problema. ¿Cómo implemento las funciones de bit a bit necesarias (módulo, cambio, rotar, agregar, xor y, o, etc.) para que ambos mantengan la compatibilidad y un nivel de rendimiento razonable ...
Conozco algunos de ellos la implementación de las funciones se hace trivialmente con 2 entradas de 32 bits. Sin embargo, ¿cómo funciona eso para shift
y rotate
?
Lo que he pensado hacer es almacenar las cadenas en forma binaria (como una cadena de 01010
). De esta forma, todas las operaciones bit a bit serán completamente independientes de la arquitectura. Pero es probable que esto ocasione una caída masiva del rendimiento, ya que se usan con mucha frecuencia en los estándares (y en otras partes de la biblioteca).
Así que mi pregunta es: ¿cómo puedo permitir fácilmente operaciones de cadena de al menos 64 bits en una compilación de 32 bits de PHP sin dejar de mantener un nivel razonable de rendimiento para cada paso ...?
Ah, y mi objetivo es la portabilidad aquí, por lo que no hay extensiones. Otras bibliotecas las consideraré, pero deben ser portátiles ...
Puede tratar un número de 64 bits como dos números de 32 bits y hacer malabares con la parte "acarrear" entre los dos números. –
@Sal: seguro. Pero eso es una especie de PITA. Supongo que si es lo mejor que puedo hacer, que así sea. Pero si hay una manera más limpia, soy todo oídos ... – ircmaxell
Generalice la funcionalidad creando un objeto "BitString" que sea solo un contenedor para la matriz de Ints con algunas funciones bit a bit que hacen lo que Salman menciona. –