OpenSSL密码库算法笔记——第6.3.2章 签名的编码

因为在签名之前,有些对象需要进行DER编码,所以接下来简要介绍一下DER编码和ASN.1

ASN.1全称为Abstract Syntax Notation One,是一种描述数字对象的方法和标准,分为数据描述语言(ISO8824)和数据编码规则(ISO8825)ASN.1的数据描述语言允许用户自定义基本数据类型,并可以通过简单的数据类型组成更复杂的数据类型。ASN.1的编码规则,规定怎么将描述的对象转换成应用程序能够处理和进行传输的二进制编码形式。

ASN.1定义了多种编码方法,包括了BER, DER, PER, XER等。最基本最常用的编码方式是BER(Basic Encoding Rules),但该编码方法可能对同一对象有几种不同的合法编码,所以在OpenSSL里面使用的是BER的子集DER(Distinguished Encoding Rules)。使用DER编码方法,每一个ASN.1对象只有唯一的二进制编码。

因为X509相关协议都是基于ASN.1DER编码的,所以OpenSSL提供了一组函数,这些函数可以读取DER编码的对象,并将它们转换成OpenSSL能够处理的内部格式;这些函数也可以将OpenSSL`里定义的C格式的对象结构转换成DER编码的对象。此外,该系列还提供了一些对这些对象进行比较、读取和设定指定值的函数。

关于ASN.1DER编码就简单介绍这些,详情可参见[4, 5, 6]。下面再简要介绍下将签名在ECDSA_SIG格式和DER编码之间转换的函数。

在签名之前,有些对象需要进行DER编码。

───────────────────────────────────────

int      i2d_ECDSA_SIG(const ECDSA_SIG *a, unsigned char **pp)

功能:    将签名从ECDSA_SIG格式编码成DER形式

输入:    a【签名的ECDSA_SIG格式】

输出:    pp

返回:    签名的DER编码长度【正常】 or 0【出错】

───────────────────────────────────────

在验证签名之时,首先需要将DER形式的对象解码成OpenSSL`里定义的签名格式ECDSA_SIG。

───────────────────────────────────────

ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **v, const unsigned char **pp, long len)

功能:    将签名从DER形式解码成ECDSA_SIG格式

输入:    pp【签名的DER编码】,len【DER编码长】

输出:    v【签名的ECDSA_SIG格式】

返回:    v【签名的ECDSA_SIG格式】

───────────────────────────────────────

这两个函数的实现细节在此处就不深入讨论了,有兴趣的话可以参见[4, 5, 6]。

        另外有一个函数是计算以DER格式编码的签名长度。

───────────────────────────────────────

int ECDSA_size(const EC_KEY *r)

功能:    计算以DER格式编码的签名长度

输入:    r【密钥长度】

输出:    -

返回:    以DER格式编码的签名长度(单位:字节)

出处:    ecdsa\ecs_lib.c

───────────────────────────────────────

你可能感兴趣的:(openssl,密码)