TPdfEncryptionRevision = (erR5, erR6, erR7);
TPdfEncryptOptions = record
UserPassword: AnsiString;
OwnerPassword: AnsiString;
Permissions: Cardinal;
EncryptMetadata: Boolean;
Revision: TPdfEncryptionRevision;
EnableIntegrityProtection: Boolean;
class function Default: TPdfEncryptOptions; static;
end;
TPdfEncryptionKeys = record
FileEncryptionKey: TBytes;
OEntry: TBytes;
UEntry: TBytes;
OEEntry: TBytes;
UEEntry: TBytes;
PermsEntry: TBytes;
KdfSalt: TBytes;
end;
TPdfIncrementalEncryptionContext = record
FileEncryptionKey: TBytes;
KdfSalt: TBytes;
Revision: TPdfEncryptionRevision;
EncryptMetadata: Boolean;
EncryptObjectNumber: Integer;
EncryptGeneration: Integer;
HasAuthenticationCode: Boolean;
end;
procedure DeriveEncryptionKeys(const Options: TPdfEncryptOptions;
out Keys: TPdfEncryptionKeys);
function BuildEncryptDictionary(const Keys: TPdfEncryptionKeys;
const Options: TPdfEncryptOptions): AnsiString;
function EncryptStreamPayload(const FileKey: TBytes;
const Plain: TBytes): TBytes;
function EncryptDocumentBytes(const PlainPdf: TBytes;
const Options: TPdfEncryptOptions): TBytes;
function DecryptAesGcmDocumentBytes(const EncryptedPdf: TBytes;
const Password: AnsiString; out PlainPdf: TBytes;
out ErrorText: string): Boolean;
function ValidateEncryptedDocumentMac(const EncryptedPdf: TBytes;
const Password: AnsiString): TPdfMacValidationResult;
function ReadIncrementalEncryptionContext(const EncryptedPdf: TBytes;
const Password: AnsiString;
out Context: TPdfIncrementalEncryptionContext;
out ErrorText: string): Boolean;
procedure ClearIncrementalEncryptionContext(
var Context: TPdfIncrementalEncryptionContext);
function EncryptIncrementalObjectBody(const PlainBody: TBytes;
const Context: TPdfIncrementalEncryptionContext;
out EncryptedBody: TBytes;
out ErrorText: string): Boolean;
FPdfEncrypt implementa el manejador de seguridad AES-256 de PDF definido en la sección 7.6 de ISO 32000-2 y la extensión AESV4-GCM definida por ISO/TS 32003. EncryptDocumentBytes convierte una matriz de bytes PDF en claro en un documento cifrado usando la revisión seleccionada
DeriveEncryptionKeys ejecuta la derivación de claves basada en contraseña que produce la clave de cifrado de archivo de 32 bytes más las entradas de diccionario /O, /U, /OE, /UE y /Perms. BuildEncryptDictionary serializa esas entradas en el texto del diccionario /Encrypt. EncryptStreamPayload aplica el cifrado AES-256-CBC a un único flujo de objeto usando la clave de archivo
Un usuario avanzado que construya un pipeline de guardado personalizado puede llamar directamente a las tres primitivas; el código de aplicación normalmente usa TPdf.SaveAsEncrypted o TPdf.SaveAsEncryptedToStream, que llaman internamente a EncryptDocumentBytes
Cuando EnableIntegrityProtection es true, el escritor emite un código de autenticación independiente ISO/TS 32004 de PDF 2.0 con un /ByteRange que cubre exactamente el EOF, /KDFSalt, CMS AuthenticatedData, HKDF-SHA256, AES-256 Key Wrap y HMAC-SHA256
PDFium actualmente no expone el análisis de AESV4 a través de su ABI pública. Llame primero a DecryptAesGcmDocumentBytes y pase los bytes devueltos a TPdf.LoadDocument; la función no devuelve texto plano parcial tras un fallo de contraseña, permiso, PDF MAC, etiqueta de cadena o etiqueta de flujo
ReadIncrementalEncryptionContext autentica la cadena de revisiones cifradas actual y recupera el estado de seguridad heredado. EncryptIncrementalObjectBody cifra las cadenas y la carga del flujo en un objeto indirecto modificado preservando las exclusiones de metadatos y actualizando los valores /Length directos; ClearIncrementalEncryptionContext limpia el material de claves recuperado
| Función | Descripción |
|---|---|
DeriveEncryptionKeys | Ejecuta la derivación de claves basada en contraseña y devuelve la clave de archivo y las cinco entradas de diccionario |
BuildEncryptDictionary | Serializa las claves y opciones en el texto del diccionario /Encrypt |
EncryptStreamPayload | Cifra un flujo de objeto con AES-256-CBC usando la clave de archivo |
EncryptDocumentBytes | Asistente de una sola pasada que deriva claves, reescribe flujos e inyecta el diccionario /Encrypt en una matriz de bytes PDF completa |
DecryptAesGcmDocumentBytes | Autentica y descifra la salida AESV4-GCM en bytes de texto plano que PDFium puede cargar |
ValidateEncryptedDocumentMac | Valida un PDF MAC independiente contra los bytes cifrados originales usando una contraseña de usuario o de propietario |
ReadIncrementalEncryptionContext | Autentica una cadena de revisiones cifradas y recupera la clave de archivo heredada, la revisión, la política de metadatos, la referencia /Encrypt y el estado del PDF MAC |
ClearIncrementalEncryptionContext | Limpia con seguridad el material de claves de cifrado incremental recuperado |
EncryptIncrementalObjectBody | Cifra cadenas y flujos en un cuerpo de objeto indirecto modificado bajo el contexto de seguridad heredado |
| Tipo | Descripción |
|---|---|
TPdfEncryptionRevision | Enumeración que selecciona la revisión AESV3-CBC erR5 o erR6, o la revisión AESV4-GCM de ISO/TS 32003 erR7 |
TPdfEncryptOptions | Registro que lleva contraseñas, indicadores de permisos, política de metadatos, revisión del manejador de seguridad y protección de integridad PDF MAC opcional |
TPdfEncryptionKeys | Registro que contiene la clave de archivo, las entradas del manejador de seguridad y el /KDFSalt de 32 bytes opcional |
TPdfIncrementalEncryptionContext | Estado de seguridad heredado autenticado usado para anexar objetos indirectos cifrados sin reemplazar el diccionario /Encrypt existente |
TPdfMacValidationStatus | pmvsValid, pmvsNotPresent, pmvsInvalid o pmvsUnsupported |
TPdfMacValidationResult | Status de validación del PDF MAC independiente y MessageText de diagnóstico |
DecryptAesGcmDocumentBytes sigue las cadenas de revisiones /Prev clásicas emitidas por el escritor incremental cifrado y resuelve la generación de objeto activa más reciente; la carga nativa de AESV4 en PDFium y la entrada externa de AESV4 en flujos xref no están disponibles en esta versiónPermissions usa la disposición de bits de la Tabla 22 de ISO 32000-1 (indicadores /P)