跳到主要内容
ecdsa.com

DER(可分辨编码规则)

ITU-T X.690 中定义的 ASN.1 规范二进制编码,使每个值都只有唯一一种字节表示,因此证书、CSR、CRL、密钥和许多签名都采用 DER 编码。
其他写法Distinguished Encoding RulesDER encodingBERX.690

每个值都采用标签–长度–值结构:一个标签字节(0x30 SEQUENCE、0x02 INTEGER、0x03 BIT STRING、0x04 OCTET STRING、0x05 NULL、0x06 OBJECT IDENTIFIER、0x0C UTF8String、0x17 UTCTime),一个长度(小于 128 时占 1 个字节,否则为 0x81/0x82…,后跟长度字节)以及内容。DER 是 BER 的受限形式:只允许确定长度,长度和整数采用最短编码,TRUE 用 0xFF 表示,SET OF 的元素需要排序。

规范编码之所以重要,是因为签名覆盖的是确切的字节:证书的 tbsCertificate 必须能逐字节相同地重新编码,签名才能通过验证。在要求 DER 的地方接受 BER 的宽松解析器,曾在多个库中导致签名延展性问题(比特币的 BIP 66)和验证被绕过。

DER 整数是有符号的,因此最高位为 1 的正数前面要加一个 0x00;这就是 P-256 的 ECDSA DER 签名长度在 70 到 72 字节之间变化的原因。PEM 只不过是 DER 的 base64 编码,再加上标头行。ASN.1 查看器可以在本地解码任何 DER 结构。

标准与参考资料

全部术语