Section courante

A propos

Section administrative du site

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.

  1. 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.

  1. unsigned char PKZIP stream byte(unsigned char pt) {
  2.  unsigned short temp;
  3.  key0=crc32(key0, pt);
  4.  key1=(key1+LSB(key0))*0x08088405+1;
  5.  key2=crc32(key2,MSB(key1));
  6.  temp=key2 | 3;
  7.  return LSB((temp*(temp^1))>>8);
  8. }
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 :

  1. unsigned long crc32( unsigned long crc, unsigned char b) {
  2.  return ((crc>>8)^crctab[LSB(crc)^b]);
  3. }

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 :

  1. 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

Exemple

Voici un exemple montrant la structure de ce format suivant en Turbo Pascal 7 :

  1. Type
  2. ZipRecL=Record
  3.   Sign:LongInt;
  4.   VerNeeded2Xtrk,GeneralPurposeBitFlag,CompressMethod:Word;
  5.   LastModFileTime,LastModFileDate:Word;
  6.   CRC32,CompressSize,UncompressSize:LongInt;
  7.   FilenameLen,ExtraFieldLen:Word;
  8.  End;

Voir également

Logiciel - 7-Zip - Présentation
Langage de programmation - PHP - Code Igniter 2.0 - Référence des classes - «zip»

Dernière mise à jour : Lundi, le 8 février 2016