Un pipeline d’admission documentaire a un jour mis en quarantaine tout un lot de dépôts juridiques comme « chiffrés », alors que chaque fichier s’ouvrait dans Adobe Acrobat sans demander de mot de passe. La sonde avait réduit l’état de sécurité à un seul booléen. Les fichiers portaient bien un dictionnaire /Encrypt, mais leurs filtres cryptographiques étaient réglés sur Identity, ce qui signifie que les chaînes et les flux étaient stockés en clair. Formellement chiffrés, pratiquement ouverts, et bloqués deux jours à cause d’un indicateur mal lu. Cet incident définit bien ce qu’un véritable audit de chiffrement doit être : non pas « est-ce chiffré », mais quel algorithme, quelle révision, quels mots de passe, quelles permissions et quelles parties du fichier sont réellement touchées par le chiffrement. PDFlibPas, le moteur PDF de losLab pour Delphi et C++Builder, expose toutes ces réponses via une API plate et une couche de classes typées
Ce que le dictionnaire /Encrypt enregistre réellement
ISO 32000-1 §7.6 définit la sécurité documentaire au moyen de quelques entrées de dictionnaire, et PDFlibPas les reflète une par une dans l’enregistrement TPDFEncryption : la version de filtre V et la révision R qui sélectionnent la famille d’algorithmes, Length pour la taille de clé, les bits de permission dans P, les chaînes de validation des mots de passe propriétaire et utilisateur O et U (plus OE/UE pour AES-256), un indicateur EncryptMetadata, et les noms des filtres cryptographiques appliqués aux chaînes, aux flux et aux fichiers intégrés
L’enregistrement est l’allié de l’auditeur précisément parce qu’il n’interprète pas. L’incident d’admission ci-dessus devient visible dans des champs comme StringFilterIdentity et StreamFilterIdentity : quand ils valent vrai, les données correspondantes ne sont pas transformées du tout, quoi que prétende l’état chiffré du document. De même, EncryptMetadata = False vous indique que les métadonnées XMP sont lisibles par n’importe quel indexeur alors que le contenu de page ne l’est pas, ce qui compte lorsque les règles de routage dépendent du titre ou de l’auteur
Une sonde de sécurité en dix lignes avec l’API plate
Pour la plupart des pipelines, quatre appels plats répondent aux questions courantes. LoadFromFile renvoie 1 en cas de succès ; ensuite, les inspecteurs de niveau document travaillent sur l’état déchiffré :
var
PDF: TPDFlib;
begin
PDF := TPDFlib.Create;
try
if PDF.LoadFromFile('contract.pdf', UserPassword) <> 1 then
raise Exception.Create('Open failed: wrong password or damaged file');
Writeln('status : ', PDF.EncryptionStatus); // decrypted / encrypted / unknown
Writeln('algorithm : ', PDF.EncryptionAlgorithm); // RC4 vs AES family
Writeln('strength : ', PDF.EncryptionStrength); // key length class
Writeln('owner pw? : ', PDF.CheckPassword(CandidatePassword));
finally
PDF.Free;
end;
end;
CheckPassword compte plus qu’il n’y paraît. Le PDF distingue un mot de passe utilisateur, requis pour ouvrir, d’un mot de passe propriétaire, qui accorde tous les droits et surpasse les permissions ; un fichier ouvert avec le mot de passe utilisateur se comporte donc très différemment d’un fichier ouvert avec le mot de passe propriétaire, mêmes octets, droits différents. La couche classe rend la distinction explicite : TPDFDocument.HasUserPassword et HasOwnerPassword indiquent ce qui est défini, tandis que IsUserPassword et IsOwnerPassword indiquent lequel a réellement ouvert la session courante. Un journal d’audit doit enregistrer cette distinction, jamais les valeurs de mot de passe elles-mêmes
L’échelle Strength : du RC4 40 bits à AES-256 révision 6
Les fonctions plates Encrypt et EncryptFile prennent un entier Strength avec cinq valeurs significatives : 0 pour RC4 40 bits, 1 pour RC4 128 bits, 2 pour AES 128 bits (lisible depuis Acrobat 7), 3 pour l’AES 256 bits introduit avec Acrobat 9 et 4 pour l’AES 256 bits requis par Acrobat X et les versions ultérieures
Les valeurs 3 et 4 méritent un examen plus attentif, car « AES-256 » désigne deux schémas différents. Strength 3 correspond à la révision 5 du gestionnaire de sécurité, une conception intermédiaire livrée avec Acrobat 9 et jamais adoptée par l’ISO. Strength 4 correspond à la révision 6, le schéma avec fonction de dérivation de clé renforcée que normalise ISO 32000-2. Pour de nouveaux documents, il n’y a aucune raison de choisir 3 ; pour les audits, la différence compte parce qu’une politique de conformité qui dit « AES-256 selon ISO 32000-2 » n’est satisfaite que par R6. Côté lecture, la couche classe sépare les deux en esAES256Bit et esAES256BitAcroX, et la propriété EncryptionAcroX répond directement à la question R5 ou R6
Bits de permission et détail de longueur de clé
EncodePermissions compacte huit indicateurs dans l’entier attendu par Encrypt et EncryptFile : imprimer, copier, modifier et ajouter des notes forment l’ensemble de base, tandis que remplir les champs, copier pour l’accessibilité, assembler et imprimer en pleine qualité forment l’ensemble étendu. Le détail, explicité dans la démo de chiffrement de la bibliothèque, est que les quatre indicateurs étendus ne sont honorés qu’à partir d’une force 128 bits, tout comme la dégradation de la qualité d’impression en mettant à 0 l’indicateur d’impression pleine qualité. Encodez une politique « impression basse résolution seulement » dans un document 40 bits, et les visionneuses imprimeront simplement en pleine qualité
La réserve plus profonde concerne qui applique ces bits. Les permissions PDF sont des instructions pour les lecteurs conformes, pas des restrictions cryptographiques : la clé de déchiffrement est la même que la copie soit autorisée ou non. Un jeu de permissions verrouillé garde les visionneuses honnêtes honnêtes. Si votre obligation est d’empêcher l’extraction plutôt que de la décourager, il faut un mot de passe utilisateur et des contrôles au niveau processus, et votre rapport d’audit doit préciser explicitement sous quel régime se trouve le fichier
Définir la politique et prouver qu’elle a tenu
Appliquer un chiffrement à des fichiers existants ne nécessite pas de les charger dans l’arbre objet. EncryptFile traite l’entrée vers la sortie en un seul appel, et la boucle d’audit rouvre le résultat pour vérifier l’issue, un modèle presque directement repris de la démo fournie :
var
PDF: TPDFlib;
R: Integer;
begin
PDF := TPDFlib.Create;
try
R := PDF.EncryptFile('in.pdf', 'out.pdf', 'owner-secret', 'user-secret', 4,
PDF.EncodePermissions(1, 0, 0, 0, // print allowed; copy/change/notes denied
0, 0, 0, 1)); // extended set: full-quality print only
if (R = 1) and (PDF.LoadFromFile('out.pdf', 'user-secret') = 1) then
begin
Writeln('algorithm = ', PDF.EncryptionAlgorithm);
Writeln('strength = ', PDF.EncryptionStrength);
Writeln('owner pw accepted: ', PDF.CheckPassword('owner-secret'));
end;
finally
PDF.Free;
end;
end;
Les équipes qui travaillent au niveau document obtiennent la même opération avec des ensembles typés plutôt qu’un compactage de bits, ce qui se lit mieux en revue de code :
if not Doc.Encrypt('owner-secret', 'user-secret', esAES256BitAcroX,
[ppCanPrint], [ppCanPrintFull]) then
raise Exception.Create('Encryption failed');
Dans les deux cas, l’étape de relecture n’est pas une cérémonie facultative. Elle attrape les erreurs de déploiement classiques, une ancienne version de bibliothèque qui rétrograde silencieusement la force demandée, un chemin de sortie jamais écrit, un entier de permissions assemblé dans le mauvais ordre d’arguments, au moment où elles se produisent plutôt que sur le poste du client. GetEncryptionFingerprint vous donne une valeur compacte à stocker avec l’enregistrement de job pour comparaison ultérieure
Faux positifs d’audit à prévoir dans le code
Trois motifs produisent régulièrement de mauvaises conclusions dans les scanners de sécurité. D’abord, le cas du filtre cryptographique Identity de l’ouverture : dictionnaire /Encrypt présent, contenu réel intact, donc vérifiez les indicateurs Identity par filtre avant de déclarer les données protégées. Ensuite, la séparation des métadonnées : EncryptMetadata peut diverger du reste du fichier dans les deux sens, si bien que « le fichier est chiffré » ne dit rien sur le paquet XMP. Enfin, les fichiers intégrés : le PDF autorise un filtre cryptographique dédié aux pièces jointes, qui peuvent donc être la seule partie chiffrée d’un document autrement ouvert, ou la seule partie en clair d’un document chiffré. Un enregistrement d’audit qui capture séparément les trois affectations de filtre, chaînes, flux, fichiers intégrés, échappe à ces trois pièges ; un enregistrement qui stocke un booléen se trompe à coup sûr
Les questions que posent réellement les auditeurs
Puis-je retirer le chiffrement d’un fichier quand j’ai le mot de passe ? Oui — DecryptFile(InputFileName, OutputFileName, Password) le fait sans chargement complet, et le Decrypt du document chargé fait de même en mémoire. Savoir si vous en avez le droit est une question de politique que vos règles d’admission doivent traiter explicitement
Quelle force utiliser pour les nouveaux documents ? Strength 4, AES-256 révision 6, sauf si vous devez prendre en charge des visionneuses plus anciennes qu’Acrobat X. Strength 2 (AES-128) reste le plancher pragmatique pour les très vieux parcs de visionneuses ; les options RC4 existent pour les audits de compatibilité, pas pour les nouvelles sorties
Les indicateurs de permission empêchent-ils un utilisateur déterminé de copier du texte ? Non. Ils sont respectés par les visionneuses conformes, et ISO 32000 les décrit comme des permissions d’accès que les lecteurs doivent appliquer, pas comme de la cryptographie. Associez-les à un mot de passe utilisateur lorsque la confidentialité est l’exigence réelle
Pour aller plus loin
L’état de chiffrement nourrit directement les décisions de signature ; un atelier qui valide et signe des documents a besoin de la même discipline de relecture, comme l’explique l’article sur l’atelier de conformité et de signature. Pour les pipelines batch qui appliquent EncryptFile à des milliers de grands documents, le guide d’accès direct aux grands PDF montre comment garder une mémoire stable pendant l’opération
La référence complète de l’API de chiffrement se trouve sur la page produit PDFlibPas