En mi aplicación real sí estoy usando buffers, supongo que eso será lo correcto ¿no? O sea, primero leo el fichero de entrada y lo guardo en un buffer de entrada, lo opero y el resultado lo almaceno en un buffer de salida, y al final este buffer de salida lo copio al nuevo fichero. Teniendo en cuenta que son muchas las operaciones a realizar, y que se hace por definición en grupos de 16 bytes, tarda relativamente poco, un archivo de 50 MB me lo encripta en menos de 3 minutos
Yo me imaginaba que el error tenía algo que ver por los caracteres de salto de linea que comentabas (curioso que el nº de repeticiones del final era igual al nº de lineas

y además funcionaba en Linux) pero ni de pasada se me abría ocurrido que era por el rb y el wb

Una cosa que ya sé
Tendré que cambiar mi manual de C, en el que tengo me dice que abra los archivos con r y w y no comenta más al respecto...
Pues muchas gracias, con tu ayuda ya he podido terminar la aplicación