Chaque valeur est un triplet tag–longueur–valeur : un octet de tag (0x30 SEQUENCE, 0x02 INTEGER, 0x03 BIT STRING, 0x04 OCTET STRING, 0x05 NULL, 0x06 OBJECT IDENTIFIER, 0x0C UTF8String, 0x17 UTCTime), une longueur (un octet en dessous de 128, sinon 0x81/0x82… suivi des octets de longueur) et le contenu. DER est une forme restreinte de BER : longueurs définies uniquement, encodages minimaux des longueurs et des entiers, 0xFF pour TRUE, éléments de SET OF triés.
L’encodage canonique compte, car les signatures portent sur des octets exacts : le tbsCertificate d’un certificat doit se réencoder à l’identique pour que la signature soit vérifiée. Des parseurs permissifs, qui acceptent du BER là où DER est exigé, ont provoqué de la malléabilité de signature (le BIP 66 de Bitcoin) et des contournements de la vérification dans plusieurs bibliothèques.
Les entiers DER sont signés : une valeur positive dont le bit de poids fort vaut 1 reçoit un 0x00 en tête ; c’est pourquoi les signatures ECDSA en DER font entre 70 et 72 octets pour P-256. PEM n’est que du base64 de DER entouré de lignes d’en-tête. L’explorateur ASN.1 décode localement n’importe quelle structure DER.