Recientemente recogí una copia de Applied Cryptography por Bruce Schneier y ha sido una buena lectura. Ahora entiendo cómo funcionan varios algoritmos delineados en el libro, y me gustaría comenzar a implementar algunos de ellos en C.¿Qué tiene de malo cambiar 32 bits de una variable de 32 bits?
Una cosa que muchos algoritmos tienen en común es dividir una clave de x bits en varias teclas y-bit más pequeñas. Por ejemplo, la clave de Blowfish, X, es de 64 bits, pero debe dividirla en dos mitades de 32 bits; Xl y Xr.
Aquí es donde me estoy atascado. Soy bastante bueno con C, pero no soy el más fuerte cuando se trata de operadores bit a bit y similares.
Después de un poco de ayuda en el IRC, me las arreglé para llegar a estas dos macros:
#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; }
#define combine(a, b, c) {a = (c << 32) | a;}
donde A es 64 bits y B y C son de 32 bits. Sin embargo, el compilador me advierte sobre el hecho de que estoy cambiando una variable de 32 bits por 32 bits.
Mis preguntas son las siguientes:
- lo que es malo trata de cambiar a 32 bits variables de 32 bits? Supongo que no está definido, pero estas macros parecen estar funcionando.
- Además, ¿sugeriría que lo hiciera de otra manera?
Como ya he dicho, estoy bastante familiarizado con C, pero los operadores bit a bit y similares todavía me dan dolor de cabeza.
EDITAR
me di cuenta de que mi combinar la macro no era en realidad la combinación de dos variables de 32 bits, sino simplemente la operación lógica OR 0 por una, y conseguir una como resultado.
Por lo tanto, además de mis preguntas anteriores, todavía no tengo un método para combinar las dos variables de 32 bits para obtener una de 64 bits; una sugerencia sobre cómo hacerlo sería apreciada.
+1, pregunta increíble, gracias por tomarse el tiempo para formatearla correctamente y ¡Bienvenido a Stack Overflow! –
Por cierto, apuesto a que su macro combinada se supone que es ORing con b, no una, ¿verdad? – tloflin