Introduction
Le format de fichier ZIP est l'un des plus anciens formats d'archive compressé sous les IBM PC avec les systèmes d'exploitation DOS et Windows. A l'origine, il fut créé par Phil Katz, pour son logiciel PKZIP (Phil Katz Zip) comme alternative au PKARC. Par la suite, sa popularité a toujours été grandissante et le nombre de concurrents a lui aussi augmenté.
L'avantage de ce format c'est qu'il est possible d'entreposer un dossier complet dans un seul fichier et d'occuper moins d'espace disque que l'originale. Cependant, il faudra attendre au format ZIP64 introduit dans le PKWARE 4.5 pour qu'il supporte des fichiers de taille supérieure à 4 Go. On désigne sous ce terme un fichier ayant été compressé en format compatible au ZIP, tel avec le 7-Zip, WinRAR, WarpZIP, PKZIP/PKUNZIP ou le WinZip par exemple. On peut décompresser le contenu d'un fichier ZIP sous les distributions Linux en utilisant la commande unzip.
Métadonnées ZIP
Les fichiers ZIP sont identifiés par des métadonnées constituées de types d'enregistrement définis contenant les informations d'entreposage nécessaires à la conservation des fichiers placés dans un fichier ZIP. Chaque type d'enregistrement doit être identifié à l'aide d'une signature d'entête identifiant le type d'enregistrement. Les valeurs de signature commencent par le marqueur constant de deux octets de 4B50h, représentant les caractères «PK».
Format général d'un fichier .ZIP
Un fichier ZIP doit contenir une «fiche de fin de répertoire central». Un fichier ZIP contenant uniquement une «fin d'enregistrement du répertoire central» est considéré comme un fichier ZIP vide. Les fichiers peuvent être ajoutés ou remplacés dans un fichier ZIP, ou supprimés. Un fichier ZIP doit avoir un seul «enregistrement de fin de répertoire central». D'autres enregistrements définis dans cette spécification peuvent être utilisés selon les besoins pour prendre en charge les exigences d'entreposage pour les fichiers ZIP individuels.
Chaque fichier placé dans un fichier ZIP doit être précédé d'un enregistrement «entête de fichier local» pour ce fichier. Chaque «entête de fichier local» doit être accompagné d'un enregistrement «entête de répertoire central» correspondant dans la section du répertoire central du fichier ZIP.
Les fichiers peuvent être entreposés dans un ordre arbitraire dans un fichier ZIP. Un fichier ZIP peut s'étendre sur plusieurs volumes ou il peut être divisé en tailles de segments définies par l'utilisateur. Toutes les valeurs doivent être entreposées dans l'ordre des octets petit-boutiste, sauf indication contraire dans ce document pour un élément de données spécifique.
La compression ne doit pas être appliquée à un «entête de fichier local», à un «entête de chiffrement» ou à une «fin d'enregistrement de répertoire central». Les «enregistrements du répertoire centraux» individuels ne doivent pas être compressés, mais l'ensemble de tous les enregistrements de répertoire central peut être compressé.
Les données du fichier peuvent être suivies d'un «descripteur de données» pour le fichier. Les descripteurs de données sont utilisés pour faciliter la diffusion de fichiers ZIP.
Format de fichier global .ZIP:
[Entête de fichier local 1] [Entête de chiffrement 1] [Données du fichier 1] [Descripteur de données 1] . . . [Entête de fichier local n] [Entête de chiffrement n] [Données du fichier n] [Descripteur de données n] [Entête de décryptage des archives] [Archiver un enregistrement de données supplémentaire] [Entête du répertoire central 1] . . . [Entête du répertoire central n] [zip64 : Fin de l'enregistrement du répertoire central] [zip64 : Fin du localisateur de répertoire central] [Fin du répertoire central] |
Structure d'entête du fichier
Voici l'entête du fichier ZIP (aussi nommé Entête de fichier locale) :
Déplacement | Taille | Description |
---|---|---|
0 | 4 octets | Ce champ permet d'indiquer la signature du fichier ZIP. La signature à la valeur 32 bits 04034b50h, soit la chaîne de caractères «PK\3\4»). |
4 | 2 octets | Ce champ permet d'indiquer la version nécessaire pour l'extrait. |
6 | 2 octets | Ce champ permet d'indiquer les bits d'informations supplémentaires. |
8 | 2 octets | Ce champ permet d'indiquer la méthode de compression, 0 = Aucune compression, 8=Méthode de compression DEFLATE (RFC 1951). |
10 | 2 octets | Ce champ permet d'indiquer l'heure de la dernière modification. |
12 | 2 octets | Ce champ permet d'indiquer la date de la dernière modification. |
14 | 4 octets | Ce champ permet d'indiquer la signature de vérification CRC-32. |
18 | 4 octets | Ce champ permet d'indiquer la taille du fichier compressé. |
22 | 4 octets | Ce champ permet d'indiquer la taille du fichier décompressé. |
26 | 2 octets | Ce champ permet d'indiquer la longueur du nom de fichier. |
28 | 2 octets | Ce champ permet d'indiquer la longueur du champ supplémentaire. |
Données du fichier
Immédiatement après l'entête local d'un fichier, doivent être placées les données compressées ou entreposées du fichier. Si le fichier est chiffré, l'entête de chiffrement du fichier doit être placé après l'entête local et avant les données du fichier. La série de [Entête de fichier local][Entête de chiffrement] [Données de fichier][Descripteur de données] se répète pour chaque fichier de l'archive «.ZIP».
Les fichiers de zéro octet, les répertoires et autres types de fichiers ne contenant aucun contenu ne doivent pas inclure de données de fichier.
Descripteur de données
Taille | Description |
---|---|
4 octets | Ce champ permet d'indiquer le CRC-32. |
4 octets | Ce champ permet d'indiquer la taille compressée. |
4 octets | Ce champ permet d'indiquer la taille non compressée. |
Ce descripteur de données doit exister si le bit 3 du drapeau binaire à usage général est activé. Il est aligné sur les octets et suit immédiatement le dernier octet de données compressées. Ce descripteur de données devrait être utilisé uniquement lorsqu'il n'était pas possible de rechercher dans le fichier .ZIP de sortie, par exemple lorsque le fichier .ZIP de sortie était une sortie standard ou un périphérique non recherchable. Pour les archives au format ZIP64, les tailles compressées et non compressées sont de 8 octets chacune.
Lors de la compression de fichiers, les tailles compressées et non compressées devraient être entreposées au format ZIP64 (sous forme de valeurs de 8 octets) lorsque la taille d'un fichier dépasse FFFFFFFFh. Cependant le format ZIP64 peut être utilisé quelle que soit la taille d'un fichier. Lors de l'extraction, si le champ supplémentaire d'informations étendues ZIP64 est présent pour le fichier, les tailles compressées et non compressées seront de 8 octets.
Bien qu'aucune signature n'ait été attribuée à l'origine, la valeur 08074B50h a généralement été adoptée comme valeur de signature pour l'enregistrement du descripteur de données. Les implémenteurs devraient être conscients que les fichiers ZIP peuvent être rencontrés avec ou sans ces descripteurs de données de marquage de signature et devraient prendre en compte les deux cas lors de la lecture des fichiers ZIP pour garantir la compatibilité.
Lors de l'écriture de fichiers ZIP, les implémenteurs devraient inclure la valeur de signature marquant l'enregistrement du descripteur de données. Lorsque la signature est utilisée, les champs actuellement définis pour l'enregistrement du descripteur de données suivront immédiatement la signature.
Un descripteur de données extensible sera publié dans une future version de cet APPNOTE. Ce nouvel enregistrement est destiné à résoudre les conflits liés à l'utilisation de cet enregistrement à l'avenir et à fournir une meilleure prise en charge du traitement des fichiers en flux de données.
Lorsque la méthode de chiffrement du répertoire central est utilisée, l'enregistrement du descripteur de données n'est pas requis, mais peut être utilisé. S'il est présent, et que le bit 3 du champ binaire à usage général est mis à 1 pour indiquer sa présence, les valeurs dans les champs de l'enregistrement du descripteur de données doivent être mises à des zéros binaires.
Entête de décryptage des archives
L'entête de décryptage d'archive est introduit dans la version 6.2 de la spécification du format ZIP. Cet enregistrement existe pour prendre en charge la fonctionnalité de chiffrement d'annuaire central mise en ouvre dans le cadre de la spécification de chiffrement fort telle que décrite dans ce document. Lorsque la structure de répertoire centrale est chiffrée, cet entête de déchiffrement doit précéder le segment de données chiffré.
Le segment de données cryptées devra être constitué de l'enregistrement de données supplémentaires d'archive (s'il est présent) et des données cryptées de la structure de répertoire central. Le format de cet enregistrement de données est identique à l'enregistrement d'en-tête de décryptage précédant les données du fichier compressé. Si la structure du répertoire central est chiffrée, l'emplacement du début de cet enregistrement de données est déterminé à l'aide du champ Début du répertoire central dans l'enregistrement Zip64 : Fin du répertoire central.
Archiver un enregistrement de données supplémentaire
Taille | Description |
---|---|
4 octets | Ce champ contient la signature de données supplémentaires d'archive (la valeur est 08064B50h) |
4 octets | Ce champ contient la longueur de champ supplémentaire. |
(taille variable) | Ce champ contient les données de champ supplémentaires. |
L'enregistrement de données supplémentaires d'archive est introduit dans la version 6.2 de la spécification du format ZIP. Cet enregistrement peut être utilisé pour prendre en charge la fonctionnalité de chiffrement du répertoire central mise en ouvre dans le cadre de la spécification de chiffrement fort telle que décrite dans cette page. Lorsqu'il est présent, cet enregistrement doit précéder immédiatement la structure de données du répertoire central.
La taille de cet enregistrement de données doit être incluse dans le champ Taille du répertoire central de l'enregistrement de fin du répertoire central. Si la structure du répertoire central est compressée, mais non chiffrée, l'emplacement du début de cet enregistrement de données est déterminé à l'aide du champ Début du répertoire central dans l'enregistrement Zip64 : Fin du répertoire central.
Structure du répertoire central
[Entête du répertoire central 1] . . . [Entête du répertoire central n] [Signature numérique] |
Entête du fichier :
Taille | Description |
---|---|
4 octets | Ce champ permet d'indiquer la signature d'entête de fichier central (valeur 02014B50h) |
2 octets | Ce champ permet d'indiquer que la version est réalisée par celui spécifié. |
2 octets | Ce champ permet d'indiquer la version nécessaire pour extraire. |
2 octets | Ce champ permet d'indiquer la drapeau de bits à usage général |
2 octets | Ce champ permet d'indiquer la méthode de compression. |
2 octets | Ce champ permet d'indiquer l'heure de la dernière modification de fichier. |
2 octets | Ce champ permet d'indiquer la date de la dernière modification de fichier. |
4 octets | Ce champ permet d'indiquer la sommation CRC-32. |
4 octets | Ce champ permet d'indiquer la taille compressée. |
4 octets | Ce champ permet d'indiquer la taille non compressée |
2 octets | Ce champ permet d'indiquer la longueur du nom de fichier. |
2 octets | Ce champ permet d'indiquer la longueur de champ supplémentaire. |
2 octets | Ce champ permet d'indiquer la longueur des commentaires du fichier. |
2 octets | Ce champ permet d'indiquer le début du numéro de disque. |
2 octets | Ce champ permet d'indiquer les attributs de fichier internes. |
4 octets | Ce champ permet d'indiquer les attributs de fichiers externes. |
4 octets | Ce champ permet d'indiquer le déplacement relatif de l'entête local. |
(taille variable) | Ce champ permet d'indiquer le nom de fichier. |
(taille variable) | Ce champ permet d'indiquer le champ supplémentaire. |
(taille variable) | Ce champ permet d'indiquer le commentaire du fichier. |
Signature numérique
Taille | Description |
---|---|
4 octets | Ce champ permet d'indiquer la signature d'entête (la valeur est 05054B50h). |
2 octets | Ce champ permet d'indiquer la taille des données. |
(taille variable) | Ce champ permet d'indiquer les données de signature. |
Avec l'introduction de la fonctionnalité de chiffrement du répertoire central dans la version 6.2 de cette spécification, la structure du répertoire central peut être entreposée à la fois compressée et cryptée. Bien que cela ne soit pas obligatoire, il est supposé lors du chiffrement de la structure de répertoire centrale qu'elle sera compressée pour une plus grande efficacité d'entreposage. L'enregistrement de signature numérique ne sera ni compressé ni crypté.
Zip64 : Fin de l'enregistrement du répertoire central
Taille | Description |
---|---|
4 octets | Ce champ permet d'indiquer la signature de fin du répertoire central du Zip64 (la valeur est 06064B50h). |
8 octets | Ce champ permet d'indiquer la taille de fin de l'enregistrement du répertoire central du zip64. |
2 octets | Ce champ permet d'indiquer la version réalisée par celui spécifié. |
2 octets | Ce champ permet d'indiquer la version nécessaire pour extraire. |
4 octets | Ce champ permet d'indiquer le numéro de ce disque. |
4 octets | Ce champ permet d'indiquer le numéro du disque avec le début du répertoire central. |
8 octets | Ce champ permet d'indiquer le nombre total d'entrées dans le répertoire central sur ce disque. |
8 octets | Ce champ permet d'indiquer le nombre total d'entrées dans le répertoire central. |
8 octets | Ce champ permet d'indiquer la taille du répertoire central. |
8 octets | Ce champ permet d'indiquer le déplacement du début du répertoire central par rapport au numéro du disque de départ. |
(taille variable) | Ce champ permet d'indiquer le secteur de données extensible Zip64. |
La valeur entreposée dans la «Zip64 : taille de la fin de l'enregistrement du répertoire central» devrait être la taille de l'enregistrement restant et ne devrait pas inclure les 12 octets de début.
- Size = SizeOfFixedFields + SizeOfVariableData - 12;
La structure d'enregistrement ci-dessus définit la version 1 de l'enregistrement de fin zip64 du répertoire central. La version 1 a été implémentée dans les versions de cette spécification antérieures à 6.2 pour prendre en charge la fonctionnalité de fichiers volumineux ZIP64. L'introduction de la fonctionnalité Central Directory Encryption implémentée dans la version 6.2 dans le cadre de la spécification Strong Encryption définit la version 2 de cette structure d'enregistrement.
Les données à usage spécial peuvent résider dans le champ du secteur de données extensible zip64 suivant une version V1 ou V2 de cet enregistrement. Pour garantir l'identification de ces données à usage spécial, elles doivent inclure un bloc d'en-tête d'identification composé des éléments suivants :
Taille | Description |
---|---|
2 octets | Ce champ permet d'indiquer l'identificateur d'entête. |
4 octets | Ce champ permet d'indiquer la taille des données. |
Le champ d'identificateur d'entête indique le type de données contenues dans le bloc de données qui suit.
La taille des données identifie le nombre d'octets suivant pour ce type de bloc de données.
Plusieurs blocs de données à usage spécial peuvent être présents. Chacun doit être précédé d'un champ identificateur d'entête et de taille des données.
Zip64 : Fin du localisateur de répertoire central
Taille | Description |
---|---|
4 octets | Ce champ permet d'indiquer la fin de la signature du localisateur de répertoire central du Zip64 (La valeur est 07064B50h) |
4 octets | Ce champ permet d'indiquer le numéro du disque avec le début du zip64 : fin du répertoire central. |
8 octets | Ce champ permet d'indiquer le déplacement relatif de la fin zip64 de l'enregistrement du répertoire central. |
4 octets | Ce champ permet d'indiquer le nombre total de disques. |
Fin de l'enregistrement dans le répertoire central
Taille | Description |
---|---|
4 octets | Ce champ permet d'indiquer la signature de la fin du répertoire central (La valeur est 06054B50h). |
2 octets | Ce champ permet d'indiquer le numéro de ce disque |
2 octets | Ce champ permet d'indiquer le numéro du disque avec le début du répertoire central |
2 octets | Ce champ permet d'indiquer le nombre total d'entrées dans le répertoire central sur ce disque. |
2 octets | Ce champ permet d'indiquer le nombre total d'entrées dans le répertoire central. |
4 octets | Ce champ permet d'indiquer la taille du répertoire central déplacement du début du répertoire central. |
4 octets | Ce champ permet d'indiquer le répertoire par rapport au numéro du disque de départ |
2 octets | Ce champ permet d'indiquer la longueur des commentaires du fichier «.ZIP». |
(taille variable) | Ce champ permet d'indiquer le commentaire du fichier «.ZIP». |
Explication des champs
Notes générales sur les champs
Sauf indication contraire, tous les champs ne sont pas signés et sont entreposés dans l'ordre Intel octet faible : octet fort, mot faible : mot élevé.
Les champs de chaîne de caractères ne se terminent pas par un caractère nul, puisque la longueur est donnée explicitement.
Les entrées du répertoire central ne peuvent pas nécessairement être dans le même ordre que celui dans lequel les fichiers apparaissent dans le fichier «.ZIP».
Si l'un des champs à la fin de l'enregistrement du répertoire central est trop petit pour contenir les données requises, le champ devrait être défini sur -1 (FFFFh ou FFFFFFFFh) et l'enregistrement au format ZIP64 devrait être créé.
La fin de l'enregistrement du répertoire central et la fin du localisateur de répertoire central Zip64 doivent résider sur le même disque lors du fractionnement ou de l'extension d'une archive.
Version réalisé par celui spécifié (2 octets)
L'octet supérieur indique la compatibilité des informations d'attribut de fichier. Si les attributs du fichier externe sont compatibles avec MS-DOS et peuvent être lus par PKZIP pour DOS version 2.04g alors cette valeur sera zéro. Si ces attributs ne sont pas compatibles, alors cette valeur identifiera le système hôte sur lequel les attributs sont compatibles. Le logiciel peut utiliser ces informations pour déterminer le format d'enregistrement de ligne pour les fichiers texte,...
La cartographie actuels est :
Valeur | Description |
---|---|
0 | MS-DOS et OS/2 (système de fichiers FAT, VFAT et FAT32) |
1 | Amiga |
2 | OpenVMS |
3 | UNIX |
4 | VM/CMS |
5 | Atari ST |
6 | OS/2 avec un système de fichiers H.P.F.S. |
7 | Macintosh |
8 | Z-System |
9 | CP/M |
10 | Windows avec un système de fichiers NTFS |
11 | MVS (OS/390 - Z/OS) |
12 | VSE |
13 | Acorn Risc |
14 | VFAT |
15 | MVS alternatif |
16 | BeOS |
17 | Tandem |
18 | OS/400 |
19 | OS X (Darwin) |
20 à 255 | Inutilisé |
L'octet inférieur indique la version de la spécification ZIP (la version de ce document) prise en charge par le logiciel utilisé pour encoder le fichier. La valeur/10 indique le numéro de version majeure et la valeur du modulo de 10 est le numéro de version mineure.
Version nécessaire pour extraire (2 octets)
La version minimale de la spécification ZIP prise en charge nécessaire pour extraire le fichier, cartographiée comme ci-dessus. Cette valeur est basée sur les fonctionnalités de format spécifiques qu'un programme ZIP doit prendre en charge pour pouvoir extraire le fichier. Si plusieurs fonctionnalités sont appliquées à un fichier, la version minimale doit être définie sur la fonctionnalité ayant la valeur la plus élevée. Les nouvelles fonctionnalités ou modifications de fonctionnalités affectant la spécification de format publiée seront implémentées en utilisant des numéros de version supérieurs à la dernière valeur publiée pour éviter les conflits.
Les versions minimales actuelles des fonctionnalités sont définies ci-dessous :
Version | Description |
---|---|
1.0 | Valeur par défaut |
1.1 | Le fichier est une étiquette de volume |
2.0 | Le fichier est un dossier (répertoire) |
2.0 | Le fichier est compressé à l'aide de la compression Deflate |
2.0 | Le fichier est crypté à l'aide du cryptage PKWARE traditionnel |
2.1 | Le fichier est compressé à l'aide de Deflate64 |
2.5 | Le fichier est compressé à l'aide de PKWARE DCL Implose |
2.7 | Le fichier est un ensemble de données de correctif |
4.5 | Le fichier utilise les extensions au format ZIP64 |
4.6 | Le fichier est compressé à l'aide de la compression BZIP2 * |
5.0 | Le fichier est crypté à l'aide de DES |
5.0 | Le fichier est crypté à l'aide de 3DES |
5.0 | Le fichier est crypté à l'aide du cryptage RC2 d'origine |
5.0 | Le fichier est crypté à l'aide du cryptage RC4 |
5.1 | Le fichier est crypté à l'aide du cryptage AES |
5.1 | Le fichier est crypté à l'aide du cryptage RC2 corrigé **. |
5.2 | Le fichier est crypté à l'aide du cryptage RC2-64 corrigé **. |
6.1 | Le fichier est crypté à l'aide d'un habillage de clef non-OAEP ***. |
6.2 | Chiffrement du répertoire central |
6.3 | Le fichier est compressé à l'aide de LZMA |
6.3 | Le fichier est compressé à l'aide de PPMd **** |
6.3 | Le fichier est crypté à l'aide de Blowfish. |
6.3 | Le fichier est crypté à l'aide de Twofish. |
* - Les premières versions 7.x (avant 7.2) de PKZIP définissaient incorrectement la version nécessaire à l'extraction pour la compression BZIP2 sur 50 alors qu'elle aurait dû être 46.
** - Voir les spécifications de chiffrement fort pour plus d'informations sur les corrections RC2.
*** - Le chiffrement des certificats à l'aide de l'encapsulation de clefs non OAEP est le mode de fonctionnement prévu pour toutes les versions commençant par 6.1. La prise en charge de l'encapsulation de clef OAEP doit être utilisée uniquement à des fins de compatibilité descendante lors de l'envoi de fichiers ZIP destinés à être ouverts par des versions de PKZIP antérieures à 6.1 (5.0 ou 6.0).
**** - Les fichiers compressés à l'aide de PPMd doivent définir la version nécessaire pour extraire le champ sur 6.3. Cependant, tous les programmes ZIP n'appliquent pas cela et peuvent être incapables de décompresser les fichiers de données compressés à l'aide de PPMd si cette valeur est définie.
Lors de l'utilisation d'extensions ZIP64, la valeur correspondante à la fin du zip64 de l'enregistrement du répertoire central doit également être définie. Ce champ devrait être réglé de manière appropriée pour indiquer si le format version 1 ou version 2 est utilisé.
Drapeau binaire à usage général (2 octets)
Bit | Description |
---|---|
0 | Si défini, indique que le fichier est crypté. |
(Pour la méthode 6 - Implosion) | |
1 | Si la méthode de compression utilisée était de type 6, Implosion, alors ce bit, s'il est défini, indique qu'un dictionnaire glissant 8K a été utilisé. Si cela est clair, alors un dictionnaire coulissant 4K a été utilisé. |
2 | Si la méthode de compression utilisée était de type 6, Implosion, alors ce bit, s'il est défini, indique que 3 arbres Shannon-Fano ont été utilisés pour coder la sortie du dictionnaire glissant. Si le bit est 0, alors 2 arbres Shannon-Fano ont été utilisés. |
(Pour les méthodes 8 et 9 - Dégonflage) | |
Bit 2 Bit 1 | |
0 0 0 1 1 0 1 1 |
L'option de compression normale (-en) a été utilisée. L'option de compression maximale (-exx/-ex) a été utilisée. L'option de compression rapide (-ef) a été utilisée. L'option de compression Super Fast (-es) a été utilisée. |
(Pour la méthode 14 - LZMA) | |
1 | Si la méthode de compression utilisée était de type 14, LZMA, alors ce bit, s'il est défini, indique qu'un marqueur de fin de flux (EOS) est utilisé pour marquer la fin du flux de données compressé. Si le bit vaut 0, alors aucun marqueur EOS n'est présent et la taille des données compressées doit être connue pour être extraite. |
Remarque : les bits 1 et 2 ne sont pas définis si la méthode de compression est autre. | |
3 | Si ce bit est activé, les champs CRC-32, taille compressée et taille non compressée sont mis à zéro dans l'en-tête local. Les valeurs correctes sont placées dans le descripteur de données immédiatement après les données compressées. (Remarque : la version 2.04g de PKZIP pour DOS ne reconnaît ce bit que pour la méthode de compression 8, les versions plus récentes de PKZIP reconnaissent ce bit pour n'importe quelle méthode de compression.) |
4 | Réservé à l'utilisation avec la méthode 8, pour un dégonflage amélioré. |
5 | Si ce bit est défini, cela indique que le fichier contient des données corrigées compressées. (Remarque : nécessite PKZIP version 2.70 ou supérieure) |
6 | Cryptage fort. Si ce bit est défini, vous devez définir la version nécessaire pour extraire la valeur à au moins 50 et vous DEVEZ Également définir le bit 0. Si le cryptage AES est utilisé, la version nécessaire pour extraire la valeur doit être au moins 51. |
7 | Actuellement inutilisé. |
8 | Actuellement inutilisé. |
9 | Actuellement inutilisé. |
10 | Actuellement inutilisé. |
11 | Drapeau de codage de langue (EFS). Si ce bit est activé, les champs de nom de fichier et de commentaire de ce fichier doivent être codés en UTF-8. |
12 | Réservé par PKWARE pour une compression améliorée. |
13 | Défini lors du chiffrement du répertoire central pour indiquer que les valeurs de données sélectionnées dans l'entête local sont masquées pour masquer leurs valeurs réelles. |
14 | Réservé par PKWARE pour les flux alternatifs. |
15 | Réservé par PKWARE. |
Méthode de compression (2 octets)
Valeur | Description |
---|---|
0 | Le fichier est entreposé (pas de compression). |
1 | Le fichier est compressé Shrunk. |
2 | Le fichier est réduit avec le facteur de compression 1 |
3 | Le fichier est réduit avec un facteur de compression 2 |
4 | Le fichier est réduit avec un facteur de compression 3 |
5 | Le fichier est réduit avec un facteur de compression 4 |
6 | Le fichier est implosé |
7 | Réservé à l'algorithme de compression Tokenizing |
8 | Le fichier est dégonflé (Deflate) |
9 | Dégonflage amélioré à l'aide de Deflate64 |
10 | Bibliothèque de compression de données Implosion de PKWARE (ancien IBM TERSE) |
11 | Réservé par PKWARE |
12 | Le fichier est compressé à l'aide de l'algorithme BZIP2 |
13 | Réservé par PKWARE |
14 | LZMA |
15 | Réservé par PKWARE |
16 | Compression IBM z/OS CMPSC |
17 | Réservé par PKWARE |
18 | Le fichier est compressé à l'aide d'IBM TERSE (nouveau) |
19 | Architecture IBM LZ77z |
20 | Obsolète (utilisez la méthode 93 pour zstd) |
93 | Compression Zstandard (zstd) |
94 | Compression MP3 |
95 | Compression XZ |
96 | Variante JPEG |
97 | Données compressées WavPack |
98 | PPMd version I, Révision 1 |
99 | Marqueur de chiffrement AE-x |
Les méthodes de 1 à 6 sont des algorithmes hérités et leur utilisation n'est plus recommandée lors de la compression de fichiers.
Champs de date et d'heure : (2 octets chacun)
La date et l'heure sont codées au format standard MS-DOS. Si l'entrée provient d'une entrée standard, la date et l'heure sont celles auxquelles la compression a commencé pour ces données. Si le chiffrement du répertoire central et l'indicateur binaire à usage général 13 sont activés pour indiquer le masquage, la valeur entreposée dans l'entête local sera nulle. Le format d'heure MS-DOS est différent des formats d'heure informatiques plus couramment utilisés tels que UTC. Par exemple, MS-DOS utilise des valeurs d'année par rapport à 1980 et une précision de 2 secondes.
CRC-32 (4 octets)
L'algorithme CRC-32 a été généreusement contribué par David Schwaderer et peut être trouvé dans son excellent livre «C Programmers Guide to NetBIOS» publié par Howard W. Sams & Co. Inc. Le "nombre magique" du CRC est DEBB20E3h. Le pré et post conditionnement CRC approprié est utilisé, ce qui signifie que le registre CRC est préconditionné avec tous les uns (une valeur de départ de FFFFFFFFh) et la valeur est postconditionnée en prenant le complément à un du résidu CRC. Si le bit 3 du drapeau à usage général est activé, ce champ est mis à zéro dans l'entête local et la valeur correcte est mise dans le descripteur de données et dans le répertoire central. Lors du chiffrement du répertoire central, si l'entête local n'est pas au format ZIP64 et que l'indicateur binaire à usage général 13 est défini pour indiquer le masquage, la valeur entreposée dans l'entête local sera zéro.
Taille compressée (4 octets)
Taille non compressée (4 octets)
La taille du fichier compressé et non compressé, respectivement. Lorsqu'un entête de décryptage est présent, il sera placé devant les données du fichier et la valeur de la taille du fichier compressé inclura les octets de l'entête de décryptage. Si le bit 3 de l'indicateur binaire à usage général est activé, ces champs sont mis à zéro dans l'entête local et les valeurs correctes sont placées dans le descripteur de données et dans le répertoire central. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFFFFFh, la taille sera dans le champ supplémentaire d'informations étendues ZIP64 correspondant de 8 octets. Lors du chiffrement du répertoire central, si l'entête local n'est pas au format ZIP64 et que l'indicateur binaire à usage général 13 est défini pour indiquer le masquage, la valeur entreposée pour la taille non compressée dans l'entête local sera zéro.
Longueur du nom de fichier (2 octets)
Longueur de champ supplémentaire (2 octets)
Longueur du commentaire du fichier (2 octets)
La longueur du nom de fichier, du champ supplémentaire et des champs de commentaire respectivement. La longueur combinée de tout enregistrement de répertoire et de ces trois champs ne devrait pas généralement dépasser 65 535 octets. Si l'entrée provient d'une entrée standard, la longueur du nom de fichier est définie sur zéro.
Début du numéro de disque (2 octets)
Le numéro du disque sur lequel commence ce fichier. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFh, la taille sera dans le champ supplémentaire d'informations étendues zip64 de 4 octets correspondant.
Attributs du fichier interne (2 octets)
Les bits 1 et 2 sont réservés à l'usage de PKWARE.
Le bit le plus bas de ce champ indique, s'il est défini, que le fichier est apparemment un fichier ASCII ou texte. S'il n'est pas défini, le fichier contient apparemment des données binaires. Les bits restants ne sont pas utilisés dans la version 1.0.
Le bit 0002h de ce champ indique, s'il est défini, qu'un champ de contrôle de longueur d'enregistrement variable de 4 octets précède chaque enregistrement logique indiquant la longueur de l'enregistrement. Le champ de contrôle de la longueur de l'enregistrement est stocké dans l'ordre des octets petit-boutiste. Cet indicateur est indépendant des caractères de contrôle du texte et, s'il est utilisé conjointement avec des données texte, inclut tous les caractères de contrôle dans la longueur totale de l'enregistrement. Cette valeur est fournie pour la prise en charge du transfert de données sur le mainframe.
Attributs du fichier externe (4 octets)
La cartographie des attributs externes dépend du système hôte (voir «version réalisée par celui spécifié»). Pour MS-DOS, l'octet de poids faible est l'octet d'attribut de répertoire MS-DOS. Si l'entrée provient d'une entrée standard, ce champ est mis à zéro.
Déplacement relatif de l'entête local (4 octets)
Il s'agit du décalage entre le début du premier disque sur lequel ce fichier apparaît et l'endroit où l'entête local devrait être trouvé. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFFFFFh, la taille sera dans le champ supplémentaire d'informations étendues zip64 correspondant de 8 octets.
Nom du fichier (variable)
Le nom du fichier, avec un chemin relatif facultatif. Le chemin entreposé ne doit pas contenir de lettre de l'unité de disque ou de périphérique, ni de barre oblique. Toutes les barres obliques doivent être des barres obliques '/' par opposition aux barres obliques inverses '\' pour la compatibilité avec les systèmes de fichiers Amiga et UNIX,... Si l'entrée provient d'une entrée standard, il n'y a pas de champ de nom de fichier.
Si l'utilisation de la fonction de cryptage du répertoire central et l'indicateur binaire à usage général 13 sont définis pour indiquer le masquage, le nom de fichier entreposé dans l'entête local ne sera pas le nom de fichier réel. Une valeur de masquage composée d'une valeur hexadécimale unique sera entreposée. Cette valeur sera incrémentée séquentiellement pour chaque fichier de l'archive. Consultez la section sur la spécification de chiffrement fort pour plus de détails sur la récupération du nom du fichier chiffré.
Commentaire du fichier (Variable)
Le commentaire pour ce fichier.
Numéro de ce disque (2 octets)
Le numéro de ce disque, qui contient l'enregistrement de fin du répertoire central. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFh, la taille sera dans le champ correspondant de 4 octets zip64 à la fin du répertoire central.
Numéro du disque avec le début du répertoire central (2 octets)
Le numéro du disque sur lequel démarre le répertoire central. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFh, la taille sera dans le champ correspondant de 4 octets zip64 à la fin du répertoire central.
Nombre total d'entrées dans le répertoire central sur ce disque (2 octets)
Le nombre d'entrées du répertoire central sur ce disque. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFh, la taille sera dans le champ correspondant de 8 octets zip64 à la fin du répertoire central.
Nombre total d'entrées dans le répertoire central (2 octets)
Le nombre total de fichiers dans le fichier .ZIP. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFh, la taille sera dans le champ correspondant de 8 octets zip64 à la fin du répertoire central.
Taille du répertoire central (4 octets)
La taille (en octets) de l'ensemble du répertoire central. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFFFFFh, la taille sera dans le champ correspondant de 8 octets zip64 à la fin du répertoire central.
Déplacement de début du répertoire central par rapport au numéro de disque de départ (4 octets)
Déplacement du début du répertoire central sur le disque sur lequel démarre le répertoire central. Si une archive est au format ZIP64 et que la valeur de ce champ est FFFFFFFFh, la taille sera dans le champ correspondant de 8 octets zip64 à la fin du répertoire central.
Longueur des commentaires du fichier .ZIP (2 octets)
La longueur du commentaire pour ce fichier «.ZIP».
Commentaire du fichier .ZIP (Variable)
Le commentaire pour ce fichier .ZIP. Les données des commentaires du fichier ZIP sont entreposées de manière non sécurisée. Aucun cryptage ni authentification des données n'est appliqué à cette zone pour le moment. Les informations confidentielles ne devraient pas être entreposées dans cette section.
Secteur de données extensible zip64 (taille variable)
(Réservé à l'usage de PKWARE)
Champ supplémentaire (Variable)
Cela devrait être utilisé pour l'extension d'entreposage. Si des informations supplémentaires doivent être entreposées dans un fichier ZIP pour des besoins spéciaux d'application ou de plate-forme, elles devraient être entreposées ici. Les programmes prenant en charge les versions antérieures de cette spécification peuvent alors ignorer le fichier en toute sécurité et rechercher le fichier ou l'entête suivant. Ce champ aura une longueur de 0 dans la version 1.0.
Les champs supplémentaires existants sont définis dans la section «Champs de données extensibles» qui suit.
Champs de données extensibles
Afin de permettre à différents programmes et différents types d'informations d'être entreposés dans le champ «extra» des fichiers .ZIP, la structure suivante doit être utilisée pour tous les programmes entreposant des données dans ce champ :
entete1+donnees1 + entete2+donnee2 ... |
Chaque entête doit comprendre :
Taille | Description |
---|---|
2 octets | Identificateur d'entête |
2 octets | Taille des données |
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Le champ d'identificateur d'entête indique le type de données contenues dans le bloc de données suivant.
Les identificateurs d'entête compris entre 0 et 31 sont réservés à l'usage de PKWARE. Les identifiants restants peuvent être utilisés par des fournisseurs tiers à des fins exclusives.
Les cartographies d'identificateur d'entête définis par PKWARE sont :
Valeur | Description |
---|---|
0001h | Champ supplémentaire d'informations étendues Zip64 |
0007h | Informations audiovisuelles |
0008h | Réservé aux données de codage de langage étendu (PFS) |
0009h | OS/2 |
000Ah | NTFS |
000Ch | OpenVMS |
000Dh | UNIX |
000Eh | Réservé aux descripteurs de flux de fichiers et de fork |
000Fh | Descripteur de correctif |
0014h | Magasin PKCS#7 pour les certificats X.509 |
0015h | Identificateur de certificat X.509 et signature pour un fichier individuel |
0016h | Identificateur de certificat X.509 pour le répertoire central. |
0017h | Entête de cryptage fort |
0018h | Contrôles de gestion des enregistrements |
0019h | Liste des certificats de destinataire du chiffrement PKCS#7 |
0020h | Réservé à l'enregistrement d'horodatage |
0021h | Enregistrement de clé de déchiffrement de stratégie |
0022h | Enregistrement du fournisseur de clef Smartcrypt |
023h | Enregistrement de données de clef de politique Smartcrypt |
0065h | Attributs IBM S/390 (Z390), AS/400 (I400) - non compressés |
0066h | Réservé aux attributs IBM S/390 (Z390), AS/400 (I400) - compressé |
4690h | POSZIP 4690 (réservé) |
Zip64 : Champ supplémentaire d'informations étendues (0001h)
Voici la disposition du bloc supplémentaire d'informations étendues zip64. Si l'un des champs de taille ou de déplacement dans l'enregistrement du répertoire local ou central est trop petit pour contenir les données requises, un enregistrement d'informations étendues Zip64 est créé.
L'ordre des champs dans l'enregistrement d'informations étendues zip64 est fixe, mais les champs doivent apparaître uniquement si le champ d'enregistrement de répertoire local ou central correspondant est défini sur FFFFh ou FFFFFFFFh.
Remarque : Tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
0001h (ZIP64) | 2 octets | Balise pour ce type de bloc supplémentaire |
Taille | 2 octets | Taille de ce bloc supplémentaire |
Format original | 8 octets | Taille du fichier original non compressé |
Taille compressée | 8 octets | Taille des données compressées |
Déplacement relatif de l'entête | 8 octets | Déplacement de l'enregistrement d'entête local |
Numéro de démarrage du disque | 4 octets | Numéro du disque sur lequel démarre ce fichier |
Cette entrée dans l'entête Local doit inclure les deux champs de taille de fichier original et compressé. Si le chiffrement du répertoire central et le bit 13 du drapeau binaire à usage général sont définis pour indiquer le masquage, la valeur entreposée dans l'entête local pour la taille du fichier d'origine sera nulle.
Champ supplémentaire OS/2 (0009h)
Ce qui suit est la disposition du bloc supplémentaire des attributs OS/2. (Dernière révision 09/05/1995)
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
0009h (OS/2) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc de données suivant |
BSize | 4 octets | Taille du bloc non compressé |
CType | 2 octets | Type de compression |
EACRC | 4 octets | Valeur CRC pour le bloc de décompression |
(variable) | variable | Bloc compressé |
La structure d'attributs étendus OS/2 (FEA2LIST) est compressée puis entreposée dans son intégralité au sein de cette structure. Il n'y aura qu'un seul bloc de données dans VarFields[].
Champ supplémentaire NTFS (000Ah)
Voici la disposition du bloc supplémentaire des attributs NTFS. (Remarque : à l'heure actuelle, les valeurs Mtime, Atime et Ctime peuvent être utilisées sur n'importe quel système WIN32.)
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
000Ah (NTFS) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc supplémentaire total |
Réservé | 4 octets | Réservé pour une utilisation future |
Tag1 | 2 octets | Valeur de balise d'attribut NTFS #1 |
Size1 | 2 octets | Taille de l'attribut numéro, en octets |
(variable) | Size1 | Données de l'attribut #1 |
: | : | : |
TagN | 2 octets | Valeur de la balise d'attribut NTFS #N |
SizeN | 2 octets | Taille de l'attribut #N, en octets |
(variable) | SizeN | Données de l'attribut #N |
Pour NTFS, les valeurs de Tag1 à TagN sont les suivantes (actuellement, un seul ensemble d'attributs est défini pour NTFS) :
Balise | Taille | Description |
---|---|---|
0001h | 2 octets | Balise pour l'attribut #1 |
Size1 | 2 octets | Taille de l'attribut #1, en octets |
Mtime | 8 octets | Heure de dernière modification du fichier |
Atime | 8 octets | Heure du dernier accès au fichier |
Ctime | 8 octets | Heure de création du fichier |
Champ supplémentaire OpenVMS (000Ch)
Voici la disposition du bloc supplémentaire des attributs OpenVMS.
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
000Ch (VMS) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc supplémentaire total |
CRC | 4 octets | CRC 32 bits pour le reste du bloc |
Tag1 | 2 octets | Valeur de la balise d'attribut OpenVMS #1 |
Size1 | 2 octets | Taille de l'attribut #1, en octets |
(variable) | Size1 | Données de l'attribut #1 |
: | : | : |
TagN | 2 octets | Valeur de la balise d'attribut OpenVMS #N |
SizeN | 2 octets | Taille de l'attribut #N, en octets |
(variable) | SizeN | Données de l'attribut #N |
Règles de champ supplémentaires OpenVMS
Un ou plusieurs attributs seront présents, chacun précédé des valeurs TagX et SizeX ci-dessus. Ces valeurs sont identiques aux constantes ATR$C_XXXX et ATR$S_XXXX étant définies dans ATR.H sous OpenVMS C. Aucune de ces valeurs ne sera jamais zéro.
Aucun alignement ou remplissage de mots n'est effectué.
Un programme PKZIP/OpenVMS se comportant bien ne devrait pas produire plus d'un sous-bloc avec la même valeur TagX. De plus, il ne doit pas y avoir plus d'un bloc «supplémentaire» de type 000Ch dans un enregistrement de répertoire particulier.
Champ supplémentaire UNIX (000Dh)
Voici la disposition du bloc supplémentaire UNIX. Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
000Dh (UNIX) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc de données suivant |
Atime | 4 octets | Heure du dernier accès au fichier |
Mtime | 4 octets | Heure de dernière modification du fichier |
Uid | 2 octets | ID utilisateur du fichier |
Gid | 2 octets | ID du groupe de fichiers |
(variable) | variable | Champ de données de longueur variable |
Le champ de données de longueur variable contiendra des données spécifiques au type de fichier. Actuellement, les seules valeurs autorisées sont les noms de fichiers d'origine «liés à» pour les liens physiques ou symboliques, ainsi que les numéros de noeud de périphérique majeur et mineur pour les noeuds de périphérique de caractère et de bloc. Étant donné que les noeuds de périphérique ne peuvent être ni des liens symboliques ni des liens physiques, un seul ensemble de données de longueur variable est entreposé. Les fichiers de lien porteront le nom du fichier d'origine entreposé. Ce nom n'est pas terminé par NULL. Sa taille peut être déterminée en vérifiant TSize - 12. Les entrées de périphérique auront huit octets entreposés sous forme de deux entrées de 4 octets (au format Little Endian). La première entrée sera le numéro de périphérique majeur et la seconde le numéro de périphérique mineur.
Champ supplémentaire du descripteur de PATCH (000Fh)
Ce qui suit est la disposition du bloc «extra» du descripteur de correctif.
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description | ||
---|---|---|---|---|
000Fh (Patch) | 2 octets | Balise pour ce type de bloc supplémentaire | ||
TSize | 2 octets | Taille du bloc supplémentaire total | ||
Version | 2 octets | Version du descripteur | ||
Flags | 4 octets | Actions et réactions : | ||
Bits | Description | |||
0 | Utiliser pour la détection automatique | |||
1 | Traiter comme un auto-patch | |||
2 à 3 | Réservé | |||
4 à 5 | Action : | |||
Valeur | Action | |||
0 | Aucune | |||
1 | Ajouter | |||
2 | Effacer | |||
3 | Correctif | |||
6 à 7 | Réservé | |||
8 à 9 | Réaction à un dossier absent : | |||
Valeur | Réaction | |||
0 | Demander | |||
1 | Sauter | |||
2 | Ignorer | |||
3 | Échec | |||
10 à 11 | Réaction à un fichier plus récent : | |||
Valeur | Réaction | |||
0 | Demander | |||
1 | Sauter | |||
2 | Ignorer | |||
3 | Échec | |||
12 à 13 | Réaction à un fichier inconnu : | |||
Valeur | Réaction | |||
0 | Demander | |||
1 | Sauter | |||
2 | Ignorer | |||
3 | Échec | |||
14 à 15 | Réservé | |||
16 à 31 | Réservé | |||
OldSize | 4 octets | Taille du fichier sur le point d'être corrigé | ||
OldCRC | 4 octets | CRC 32 bits du fichier à corriger | ||
NewSize | 4 octets | Taille du fichier résultant | ||
NewCRC | 4 octets | CRC 32 bits du fichier résultant |
La prise en charge des PATCH est assurée par la technologie PKPatchMaker et est couverte par les brevets américains et les brevets en attente. L'utilisation ou la mise en oeuvre dans un produit de certains aspects technologiques énoncés dans la documentation de la page APPNOTE.TXT, y compris ceux relatifs au cryptage fort ou aux correctifs, nécessite une licence de PKWARE.
Magasin PKCS#7 pour les certificats X.509 (0014h)
Ce champ doit contenir des informations sur chacun des fichiers de certificats avec lesquels peuvent être signés. Lorsque la fonctionnalité de cryptage du répertoire central est activée pour un fichier ZIP, cet enregistrement apparaîtra dans l'enregistrement de données supplémentaires d'archive, sinon il apparaîtra dans le premier enregistrement du répertoire central et sera ignoré dans tout autre enregistrement.
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
0014h (Magasin) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille des données du magasin |
TData | TSize | Données sur le magasin |
Identificateur de certificat X.509 et signature pour un fichier individuel (0015h)
Ce champ contient les informations sur le certificat du magasin PKCS#7 ayant été utilisé pour signer un fichier particulier. Il contient également les données de signature. Ce champ peut apparaître plusieurs fois, mais ne peut apparaître qu'une seule fois par certificat.
Remarque : tous les champs sont stockés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
0015h (CID) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille des données qui suivent |
TData | TSize | Données de signature |
Identificateur de certificat X.509 et signature pour le répertoire central (0016h)
Ce champ contient les informations sur le certificat du magasin PKCS#7 ayant été utilisé pour signer la structure de répertoires centrale. Lorsque la fonctionnalité de cryptage du répertoire central est activée pour un fichier ZIP, cet enregistrement apparaîtra dans l'enregistrement de données supplémentaires d'archive, sinon il apparaîtra dans le premier enregistrement du répertoire central.
Remarque : tous les champs sont entreposés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
0016h (CDID) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille des données qui suivent |
TData | TSize | Data |
Entête de chiffrement fort (0017h)
Valeur | Taille | Description |
---|---|---|
0017h | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille des données qui suivent |
Format | 2 octets | Définition du format pour cet enregistrement |
AlgID | 2 octets | Identifiant de l'algorithme de chiffrement |
Bitlen | 2 octets | Longueur en bits de la clef de chiffrement |
Flags | 2 octets | Drapeau de traitement |
CertData | TSize-8 | Données de champ supplémentaires de déchiffrement du certificat. |
Contrôles de gestion des enregistrements (0018h)
Valeur | Taille | Description |
---|---|---|
(Rec-CTL) 0018h | 2 octets | Balise pour ce type de bloc "extra" |
CSize | 2 octets | Taille du total des données de bloc supplémentaires |
Tag1 | 2 octets | Attribut de contrôle d'enregistrement 1 |
Size1 | 2 octets | Taille de l'attribut 1, en octets |
Data1 | Size1 | Données de l'attribut 1 |
: | : | : |
TagN | 2 octets | Attribut de contrôle d'enregistrement N |
SizeN | 2 octets | Taille de l'attribut N, en octets |
DataN | SizeN | Données de l'attribut N |
Liste des certificats des destinataires du chiffrement PKCS#7 (0019h)
Ce champ peut contenir des informations sur chacun des certificats utilisés dans le traitement de cryptage et peut être utilisé pour identifier qui est autorisé à décrypter les fichiers cryptés. Ce champ devrait apparaître uniquement dans l'enregistrement de données supplémentaires de l'archive. Ce champ n'est pas obligatoire et sert uniquement à faciliter les modifications des archives en préservant les données de la clef de chiffrement publique. Les exigences de sécurité individuelles peuvent imposer que ces données soient omises afin de dissuader la divulgation d'informations.
Remarque : tous les champs sont stockés dans l'ordre Intel octet faible/octet élevé.
Valeur | Taille | Description |
---|---|---|
0019h (CStore) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille des données du magasin |
TData | TSize | Données sur le magasin |
TData :
Valeur | Taille | Description |
---|---|---|
Version | 2 octets | Numéro de version du format - doit être 0001h pour le moment |
CStore | (variable) | Objet blob de données PKCS#7 |
Champ supplémentaire MVS (0065h)
Voici la disposition du bloc supplémentaire MVS.
Remarque : Certains champs sont entreposés au format Big Endian. Tout le texte est au format EBCDIC, sauf indication contraire.
Valeur | Taille | Description |
---|---|---|
0065h (MVS) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc de données suivant |
ID | 4 octets | EBCDIC "Z390" E9F3F9F0h ou "T4MV" pour TargetFour |
(variable) | TSize-4 | Données d'attribut |
Champ supplémentaire OS/400 (0065h)
Voici la disposition du bloc supplémentaire OS/400. Remarque : Certains champs sont entreposés au format Big Endian. Tout le texte est au format EBCDIC, sauf le drapeau contraire.
Valeur | Taille | Description |
---|---|---|
0065h (OS400) | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc de données suivant |
ID | 4 octets | EBCDIC "I400" C9F4F0F0h ou T4MV pour TargetFour |
(variable) | TSize-4 | Données d'attribut |
Champ supplémentaire d'enregistrement de clef de déchiffrement de stratégie (0021h)
Voici la disposition du bloc supplémentaire de clef de déchiffrement de stratégie. TData est un champ de longueur variable et de contenu variable. Il contient des informations sur les chiffrements et/ou les sources de clefs de chiffrement. Les informations contenues dans ce bloc supplémentaire peuvent également être placées dans des champs de commentaires.
Valeur | Taille | Description |
---|---|---|
0021h | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc de données suivant |
TData | TSize | Données sur la clef |
Champ supplémentaire d'enregistrement du fournisseur de clef (0022h)
Voici la disposition du bloc supplémentaire du fournisseur de clefs. TData est un champ de longueur variable et de contenu variable. Il contient des informations sur les chiffrements et/ou les sources de clés de chiffrement. Les informations contenues dans ce bloc supplémentaire peuvent également être placées dans des champs de commentaires.
Valeur | Taille | Description |
---|---|---|
0022h | 2 octets | Balise pour ce type de bloc supplémentaire |
TSize | 2 octets | Taille du bloc de données suivant |
TData | TSize | Données sur la clef |
Le chiffrement de flux PKZIP
Le chiffrement de flux PKZIP a été conçu par Roger Schaffely et est entièrement décrit dans le fichier APPNOTE.TXT trouvé dans la plupart des distributions PKZIP. L'état interne du chiffrement se compose de trois mots de 32 bits : key0, key1 et key2. Ces valeurs sont initialisées à 0x12345678, 0x23456789 et 0x34567890, respectivement. L'état interne est mis à jour en mélangeant l'octet de texte en clair suivant. Les premier et troisième mots sont mis à jour à l'aide du registre à décalage à rétroaction linéaire connu sous le nom de CRC-32 ; le deuxième mot est mis à jour à l'aide d'un générateur congruentiel linéaire tronqué. L'octet de sortie est le résultat d'une opération de pseudo-carré tronquée.
689 où «unsigned char» est un entier de 8 bits; «unsigned short» est un entier de 16 bits ; | est OU au niveau du bit ; ^ est XOR ; >> *-124573/ est le décalage à droite ; «LSB» et «MSB» sont respectivement les octets de poids faible et de poids fort ; et « 0x » est un préfixe indiquant un caractère hexadécimal.
Pour les besoins de cet exemple, nous définissons crc32() comme étant :
où «unsigned long» est un entier de 32 bits.
L'ancien état LFSR est décalé de huit bits vers la droite et XOR avec l'entrée de 32 bits d'une table indexée par octets pour produire le nouvel état. L'index est l'octet de poids faible de l'ancien état XOR avec b. La fonction est linéaire ; c'est-à-dire :
- crctab[x^y]=crctab[x]^crctab[y];
Le chiffrement est saisi en chiffrant le mot de passe de l'utilisateur et en supprimant les octets du flux correspondant. Les octets du flux produits après ce point sont XORed avec le texte en clair pour produire le texte chiffré.
Le point crucial de toutes nos attaques réside dans le fait qu'il n'y a pratiquement aucune diffusion dans l'état interne. Sur les quatre-vingt-seize bits de l'état interne, huit bits de key0 affectent key1 ; huit bits de key1 affectent key2 ; et quatorze bits de key2 affectent l'octet du flux de sortie.
Format de fichier crypté
Les fermetures ZIP doivent ajouter douze octets au début du fichier à chiffrer. Le format de fichier ZIP précise que les onze premiers doivent être aléatoires et que le dernier doit être l'octet de poids faible du CRC du fichier archivé. L'intégralité du CRC est entreposée en texte brut et cet octet sert de filtre de mot de passe. Certaines fermetures éclair, comme InfoZIP et WinZip, entreposent dix octets aléatoires et les deux octets de poids faible du CRC.
Nous supposons que deflate était l'algorithme utilisé pour compresser les données sous-jacentes. L'auteur a effectué un test statistique grossier sur quelques centaines de fichiers de différents types et tailles et a constaté qu'étant donné le type de fichier, indiqué par son extension et sa taille, on peut deviner les deux premiers octets et demi du fichier compressé. Étant donné que les octets de la somme de contrôle se trouvent à la toute fin de l'entête ajouté, vous pouvez les utiliser pour augmenter le texte brut du fichier lors du montage d'une attaque.
Remarques
- Le langage de programmation C pour Linux offre à l'aide de l'entête «zip.h» de nombreuses fonctions de manipulation de ce format : ZIP_ADD, ZIP_ADD_DIR, ZIP_CLOSE, ZIP_DELETE, ZIP_ERROR_CLEAR, ZIP_ERROR_GET, ZIP_ERROR_GET_SYS_TYPE, ZIP_ERROR_TO_STR, ZIP_FCLOSE, ZIP_FILE_ERROR_CLEAR, ZIP_FILE_ERROR_GET, ZIP_FILE_STRERROR, ZIP_FOPEN, ZIP_FOPEN_INDEX, ZIP_FREAD, ZIP_GET_ARCHIVE_COMMENT, ZIP_GET_FILE_COMMENT, ZIP_GET_NAME, ZIP_GET_NUM_FILES, ZIP_NAME_LOCATE, ZIP_OPEN, ZIP_RENAME, ZIP_REPLACE, ZIP_SET_ARCHIVE_COMMENT, ZIP_SET_FILE_COMMENT, ZIP_SOURCE_BUFFER, ZIP_SOURCE_FILE, ZIP_SOURCE_FILEP, ZIP_SOURCE_FREE, ZIP_SOURCE_FUNCTION, ZIP_SOURCE_ZIP, ZIP_STAT, ZIP_STAT_INDEX, ZIP_STAT_INIT, ZIP_STRERROR, ZIP_UNCHANGE, ZIP_UNCHANGE_ALL et ZIP_UNCHANGE_ARCHIVE.
- Le langage de programmation Java offre dans son module «java.util.zip» toutes classes nécessaires à la manipulation de ce format.
- Il est possible de supporter ce format en langage de programmation Free Pascal grâce à l'objet TZipFile sous licence LGPL de l'auteur Darius Blaszijk ou du «paszlib» intégrer par Jacques Nomssi Nzali à partir de la bibliothèque «zlib».
- Le cadre d'application .NET propose une classe appelé System.IO.Compression.ZipArchive permettant de manipuler des fichiers «.zip».
- Si vous utilisez PowerShell, il existe les commandes Compress-Archive et Expand-Archive faisant compressé et décompressé respectivement les fichiers de format ZIP.
Exemple
Voici un exemple montrant la structure de ce format suivant en Turbo Pascal 7 :
Voir également
Logiciel - 7-Zip - Présentation
Langage de programmation - PHP - Code Igniter 2.0 - Référence des classes - «zip»