PDFiumPas escribe el cifrado ISO/TS 32003 mediante SaveAsEncrypted: fije Revision en erR7 y cada cadena y stream queda protegido con AES-256 en modo GCM, el cifrado autenticado que PDF 2.0 obtuvo en 2023. Fije también EnableIntegrityProtection y el documento además llevará un token PDF MAC independiente, que ValidatePdfMac verifica del lado de la lectura
Se trata de dos protecciones distintas que la gente suele confundir. GCM autentica cada valor cifrado. El MAC autentica el documento como un todo. Usted quiere ambas, por razones diferentes
¿Qué agrega GCM que CBC nunca ofreció?
Autenticación del texto cifrado. AES-256 en modo CBC, el esquema AESV3 de ISO 32000-2, mantiene el contenido confidencial y no dice nada sobre si llegó sin modificaciones. CBC es maleable de formas específicas y bien estudiadas: un atacante que puede invertir bits en el texto cifrado produce cambios predecibles en el texto plano del bloque siguiente, y nada en el formato lo nota
GCM cierra esa brecha. Cada valor cifrado lleva una etiqueta de autenticación de 16 bytes, serializada por completo como lo exige ISO/TS 32003, y el descifrado falla en lugar de devolver texto plano alterado cuando la etiqueta no coincide. En términos de PDF, una cadena o stream manipulado en un documento AESV4 es un error irrecuperable en el punto de uso, no un valor extraño que se propaga hacia su aplicación. El diccionario Encrypt marca esto con /CFM /AESV4 y V 6 / R 7, junto con una entrada de extensión que declara /ExtensionLevel 32003 y /ExtensionRevision (:2023)
Tres revisiones, tres ecosistemas
TPdfEncryptionRevision ofrece erR5, erR6 y erR7, y la elección es más una decisión de compatibilidad que criptográfica. R5 es el esquema AES-256 original publicado como extensión de PDF 1.7, con un único hash de contraseña SHA-256, y abre en prácticamente cualquier visor de los últimos quince años. R6 es la derivación de clave reforzada estandarizada en ISO 32000-2, usando la construcción iterativa SHA-256/384/512 del algoritmo 2.B, y es lo que espera un flujo de trabajo actual de PDF 2.0 o PDF/A-4. R7 es ISO/TS 32003, y usa esa misma derivación 2.B con AES-GCM como cifrador
El soporte de los lectores sigue exactamente ese orden, y el soporte de R7 todavía es escaso fuera de los visores principales actuales. Es la misma disyuntiva que gobierna cualquier función de PDF 2.0: la opción más nueva es la mejor ingeniería y la audiencia más estrecha. Decida según quién tenga que abrir el archivo, y si esa respuesta es "un sistema de gestión de registros que nadie ha actualizado desde 2019", la respuesta es R5 sin importar lo que prefiera la política de seguridad
uses
PDFium, FPdfEncrypt;
var
Pdf: TPdf;
Opts: TPdfEncryptOptions;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'quarterly-report.pdf';
Pdf.LoadDocument;
Opts := TPdfEncryptOptions.Default;
Opts.UserPassword := 'open-secret';
Opts.OwnerPassword := 'admin-secret';
Opts.EncryptMetadata := True;
Opts.Revision := erR7; // ISO/TS 32003 AESV4-GCM
Opts.EnableIntegrityProtection := True; // token PDF MAC independiente
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
¿Por qué un MAC de documento además de un cifrador autenticado?
Porque las etiquetas GCM protegen los valores, no la disposición de esos valores. Cada cadena y stream en un documento AESV4 está autenticado individualmente, y sin embargo la tabla de referencias cruzadas, la numeración de objetos y el trailer son estructura, no contenido cifrado. Un atacante no puede falsificar un stream, pero nada en el cifrador por sí solo le impide reorganizar a qué objetos apunta el documento, o insertar objetos de una revisión anterior del mismo archivo
El token PDF MAC independiente atiende esa capa. PDFiumPas lo deriva de la clave de cifrado del archivo con un /KDFSalt dedicado de 32 bytes registrado en el diccionario Encrypt, de modo que poseer la contraseña es lo que le permite a un lector confirmar el token. El resultado es una sola respuesta a una sola pregunta: es este documento, como un todo, el documento que se escribió
var
Pdf: TPdf;
Mac: TPdfMacValidationResult;
begin
Pdf := TPdf.Create(nil);
try
Pdf.Password := 'open-secret';
Pdf.FileName := 'quarterly-report.enc.pdf';
Pdf.LoadDocument;
Mac := Pdf.ValidatePdfMac('open-secret');
case Mac.Status of
pmvsValid: ProcessDocument(Pdf);
pmvsNotPresent: ProcessWithWarning(Pdf); // sin token en este archivo
pmvsInvalid: Quarantine(Mac.MessageText); // manipulado o truncado
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
Los cuatro valores de estado necesitan cuatro respuestas distintas, y reducirlos a un booleano hace perder la distinción que importa. pmvsNotPresent significa que el archivo simplemente no tiene token, algo que describe a casi todo PDF cifrado escrito antes de 2024 y no es evidencia de nada. pmvsInvalid significa que hay un token presente y no verifica, lo cual es un hallazgo genuino y debería detener el procesamiento. pmvsUnsupported significa que el token existe en una forma que esta compilación no implementa, lo cual es una brecha de compatibilidad, no un ataque. Tratar "no presente" como "inválido" pondría en cuarentena todo su archivo histórico desde el primer día
Lo que el cifrado todavía no hace
Las opciones de permisos siguen siendo lo que siempre fueron: una solicitud al software compatible, no un control. Los bits /P de la tabla 22 de ISO 32000-1 que prohíben imprimir o extraer son respetados por visores bien comportados e ignorados por todo lo demás, y cualquiera que posea la contraseña de usuario ya tiene el contenido descifrado. El cifrado es el límite; los permisos describen la intención dentro de él
Vale la pena planificar dos detalles operativos. Primero, el cifrado y la modificación posterior interactúan: agregar una actualización incremental a un documento cifrado tiene sus propias reglas, cubiertas en actualizaciones incrementales sobre PDF cifrados, y un token MAC es una afirmación a nivel de documento que un anexo descuidado invalidará. Segundo, la construcción GCM usa un contador de IV determinístico, y PDFiumPas genera una excepción en lugar de reutilizar un valor de contador si ese espacio alguna vez se agotara, porque la reutilización de nonce en GCM es catastrófica de una forma que un desbordamiento silencioso ocultaría
Cómo elegir entre las tres revisiones en la práctica
Anote quién abre el archivo, y luego elija. Para distribución interna, donde cada lector es un visor actual bajo su control, R7 con protección de integridad es la opción más sólida disponible y no hay razón para no usarla. Para documentos que salen de la organización, R6 es el valor predeterminado defendible: está estandarizado en ISO 32000-2 en lugar de en una especificación técnica encima de esta, y el soporte es amplio. Para archivos históricos y consumidores heredados, R5 es la única opción que abre de forma confiable, y usted debería registrar el motivo en el mismo lugar donde registra el resto de su política de retención
Cualquiera que elija, verifique la salida en lugar de confiar en que la llamada tuvo éxito. Vuelva a abrir el archivo cifrado, revise ValidatePdfMac, y confirme que la versión declarada es la que espera, usando las verificaciones de conformidad de versión descritas en conformidad exacta de versión PDF. Una lista de verificación más amplia para documentos no confiables está en auditoría de riesgos de seguridad en PDF
PDFiumPas es un componente para Delphi y Lazarus construido alrededor del motor PDFium, con la pila de cifrado de PDF 2.0 implementada de forma nativa en Pascal, de modo que AES-256, GCM y el token MAC no necesitan ninguna DLL criptográfica externa. La API de cifrado está documentada en la página del componente PDFium Delphi