¿Qué hace que la computadora reconozca un archivo como un determinado tipo de archivo? ¿Y cómo puedo cambiarlo (con java)?

Estoy creando un progtwig en Java que lee un flujo de entrada de un archivo, lo cifra cambiando los números de los bytes según la contraseña y crea un nuevo archivo cifrado.

Por ejemplo:
Creé un archivo de prueba que contenía las palabras:
This is a test to see if the encrypter project works.
Cuando leo los bytes en java, me sale:
[84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 116, 101, 115, 116, 32, 116, 111, 32, 115, 101, 101, 32, 105, 102, 32, 116, 104, 101, 32, 101, 110, 99, 114, 121, 112, 116, 101, 114, 32, 112, 114, 111, 106, 101, 99, 116, 32, 119, 111, 114, 107, 115, 46, 10]
Entonces tomo el valor de cada byte, y rest el valor Unicode de las contraseñas, y obtengo el valor absoluto de eso. Luego escribo eso en un archivo.

Estaba jugando con diferentes algoritmos para cifrarlo, y comencé a probarlo en un archivo de texto de prueba. Estoy usando Linux, así que no hay extensiones de archivo (por ejemplo, .txt, .pdf, etc …) Me di cuenta después de varias veces de cifrarlo, que la computadora ya no lo reconocía como un archivo de texto, sino que , como un archivo de imagen! (es decir, cuando hace clic en él, de forma predeterminada, intenta abrir el archivo en un editor de imágenes)

Asi que aqui están mis preguntas:

1. ¿Qué hace que la computadora reconozca un archivo como un determinado tipo de archivo?

  • Supongo que tiene algo que ver con ciertos bytes que ve en algún lugar del archivo, pero más allá de eso, estoy perdido.

2. ¿Dónde se almacena esta información en el archivo?

  • Esperaba poder mantener el archivo como el mismo tipo de archivo incluso después del cifrado, así que pensé que si, por ejemplo, la información del tipo de archivo estaba en los primeros 10 bytes, cifraría todo después de eso, pero deje esos primeros 10 bytes solo, por ejemplo.

3. ¿Es la información de tipo de archivo estándar?

  • Estos bytes tienen un significado que es estándar en todas las plataformas (es decir, un archivo pdf es un archivo pdf sin importar en qué computadora lo use. Es debido a la extensión .pdf , o es debido a los bytes que están en algún lugar en el archivo.)

4. Suponiendo que se reconoce el tipo de archivo debido a los bytes en el archivo, ¿cómo puedo cambiar el tipo de archivo?

  • ¿Dónde puedo encontrar una lista de qué bytes significan qué en un archivo?

En los sistemas UNIX tradicionales, los archivos se identifican únicamente buscando patrones particulares de bytes que aparecen en el archivo.

El comando de file usa un archivo de configuración magic (a menudo /etc/magic , o /usr/share/file/magic ) que contiene las reglas que definen esos patrones de bytes.

Eso es todo, no hay metadatos adicionales especiales, todo se hace mediante el análisis del contenido.

Por lo general, estará dentro de los primeros bytes del archivo.

De Wikipedia :

Metadatos internos
Una segunda forma de identificar un formato de archivo es almacenar información sobre el formato dentro del propio archivo. Por lo general, dicha información se escribe en una (o más) cadena (s) binaria (es), los textos etiquetados o sin procesar se colocan en ubicaciones fijas y específicas dentro del archivo. Dado que el lugar más fácil para ubicarlos es al principio, tal área generalmente se denomina encabezado de archivo cuando es mayor que unos pocos bytes, o un número mágico si solo tiene unos pocos bytes.

Aunque el tipo de archivo no necesariamente se va a almacenar en los primeros bytes, se puede almacenar en otro lugar

Los metadatos contenidos en el encabezado de un archivo no necesariamente se almacenan solo al principio, sino que también pueden estar presentes en otras áreas, a menudo incluyendo el final del archivo; depende del formato del archivo o del tipo de datos que contiene. Los archivos basados ​​en caracteres (texto) tienen encabezados legibles por humanos, mientras que los formatos binarios generalmente tienen encabezados binarios, aunque eso no es una regla: un encabezado de archivo legible por humanos puede requerir más bytes, pero se puede distinguir fácilmente con texto simple o Editores hexadecimales. Los encabezados de los archivos no solo pueden contener la información requerida por los algoritmos para identificar solo el formato del archivo, sino también los metadatos reales sobre el archivo y su contenido. Por ejemplo, la mayoría de los formatos de archivo de imagen almacenan información sobre el tamaño de la imagen, la resolución, el espacio / formato de color y, opcionalmente, otra información de autoría, como quién, cuándo y dónde se realizó, con qué modelo de cámara y los parámetros de disparo se tomaron (si los hubiera, ref. ), y así. Dichos metadatos pueden ser utilizados por un progtwig que lee o interpreta el archivo tanto durante el proceso de carga como después, pero también puede ser utilizado por el sistema operativo para capturar rápidamente información sobre el archivo sin cargarlo todo en la memoria.

Otro método para almacenar el tipo de archivo dentro del archivo es usar números mágicos

Una forma de incorporar dichos metadatos, a menudo asociados con Unix y sus derivados, es simplemente almacenar un “número mágico” dentro del propio archivo. Originalmente, este término se usaba para un conjunto específico de identificadores de 2 bytes al comienzo de un archivo, pero dado que cualquier secuencia binaria no decodificada puede considerarse como un número, cualquier característica de un formato de archivo que lo distinga de forma única puede usarse para la identificación. . Las imágenes GIF, por ejemplo, siempre comienzan con la representación ASCII de GIF87a o GIF89a, dependiendo del estándar al que se adhieran. Muchos tipos de archivos, especialmente los archivos de texto plano, son más difíciles de detectar con este método. Los archivos HTML, por ejemplo, pueden comenzar con la cadena (que no distingue entre mayúsculas y minúsculas), o una definición de tipo de documento apropiada que comience con

El tipo de archivo ni siquiera tiene que almacenarse dentro del archivo. Otros métodos incluyen extensiones de nombre de archivo o incluso metadatos externos

Una forma final de almacenar el formato de un archivo es almacenar explícitamente información sobre el formato en el sistema de archivos, en lugar de dentro del propio archivo. Este enfoque mantiene los metadatos separados tanto de los datos principales como del nombre, pero también es menos portátil que las extensiones de archivos o los “números mágicos”, ya que el formato se debe convertir de un sistema de archivos a otro. Si bien esto también es cierto hasta cierto punto con las extensiones de nombre de archivo, por ejemplo, para la compatibilidad con el límite de tres caracteres de MS-DOS, la mayoría de las formas de almacenamiento tienen una definición aproximadamente equivalente de los datos y el nombre de un archivo, pero pueden tener una representación variable o nula de otros. metadatos

También hay muchas otras formas, pero estas suelen ser las más comunes.