Zzangg  

7. 其他密码相关的ASN.1问题

1. DSA的ASN.1描述

DSA(数字签名算法,Digital Signature Algorithm)是一种用于数字签名的非对称加密算法。它是由美国国家安全局(NSA)在1991年开发的,作为美国联邦信息处理标准(FIPS)的一部分获得了广泛应用。DSA的目的是在数字环境中提供认证和数据完整性,通过公钥和私钥对电子文档进行签名以确认发送者和内容的真实性。使用DSA可以在不暴露私钥的情况下向接收者证明发送者的身份,同时确保数据在传输过程中不被篡改。

1.1 DSA的ASN.1格式

DSA的ASN.1格式通常包括以下部分:
1.1.1. 算法标识符(Algorithm Identifier):表示所使用的数字签名算法。

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}

1.1.2. 数字签名结构:表示数字签名所需的关键数据
DSASignature ::= SEQUENCE {
r INTEGER,
s INTEGER
}

1.1.3. 公钥和私钥:DSA的公钥和私钥数据结构。
DSAPublicKey ::= INTEGER
DSAParameters ::= SEQUENCE {
p INTEGER,
q INTEGER,
g INTEGER
}
DSAPrivateKey ::= INTEGER
在这个定义中,

Dss-Parms 表示DSA参数的类型名称。
SEQUENCE 是一个ASN.1结构,表示一个有序且不重复的元素列表。

  • p 是大素数(模数)。
  • q 是一个小素数,它是p-1的因子。
  • g 是一个整数,它满足g^q ≡ 1 mod p。

此外,DSA公钥和私钥的ASN.1定义如下:
DSAPublicKey ::= INTEGER (0..p-1)

DSAPrivateKey ::= INTEGER (0..q-1)

1.2 OpenSSL验证DSA的ASN.1格式

输入openssl dsaparam -genkey 1024 | openssl dsa -out dsa_key.pem

此命令会生成一个包含1024位DSA参数的密钥文件dsa_key.pem
image

输入openssl pkcs8 -topk8 -inform PEM -outform PEM -in dsa_key.pem -out dsa_key_pkcs8.pem
这将生成一个PKCS#8格式的密钥文件dsa_key_pkcs8.pem,其中包含您的DSA私钥。
image

使用openssl asn1parse -in dsa_key.pem验证其ASN.1结构
image

详细检查特定的ASN.1组件(如DSA的p,q和g参数),可以使用以下命令提取和显示它们:openssl dsa -in dsa_key.pem -text -noout
image

通过asn.1viewer检验,和标准一样有7个integer
image

pkcs#8中7个integer每个里面都有oid,与标准相符
image

2. ECC的ASN.1描述

椭圆曲线密码(Elliptic Curve Cryptography,ECC)是一种公钥密码算法,常用于数字签名、加密和密钥协商等应用场景。与RSA和DSA等其他公钥加解密算法相比,ECC具有更小的密钥尺寸和更高的安全性。

ECC算法是基于椭圆曲线数学理论的。在椭圆曲线上进行的运算可以用于设计公钥密码系统,并实现数据加密和解密、数字签名和密钥协商功能。ECC密钥由一对基于椭圆曲线的公钥和私钥组成。椭圆曲线上的点加法和标量乘法是ECC算法中的核心运算。标量乘法是指在椭圆曲线上,将一个随机数(称为私钥)与曲线上的某个点(称为公钥)相乘所得到的点,这个点作为私钥和公钥的组合进行数据加密和解密。

在SEC 1 (Standards for Efficient Cryptography)和ANSI X9.62中定义了椭圆曲线密码学相关的ASN.1表示法。

2.1 ECC的ASN.1表示法

  1. ECC 私钥所需的所有信息字段
    ECCPrivateKey ::= SEQUENCE {
    version INTEGER {ecPrivkeyVer1(1)} (ecPrivkeyVer1),
    privateKey OCTET STRING,
    parameters [0] ECCParameters OPTIONAL,
    publicKey [1] BIT STRING OPTIONAL
    }

  2. 表示 ECC 密钥交换和认证算法的参数
    ECCParameters ::= CHOICE {
    namedCurve OBJECT IDENTIFIER
    }
    在具体的 ECC 密钥协商协议中,ECCParameters 可能包含以下几个备选项之一:

  • namedCurve:使用一个预定义的、具有名称的 ECC 曲线。
  • implicitCurve:使用一个隐式定义的、自定以的 ECC 曲线。
  • specifiedCurve:使用一个显式指定的、具有参数的 ECC 曲线。
  1. 表示椭圆曲线密码学中的 ECC 公钥信息
    ECSubjectPublicKeyInfo ::= SEQUENCE {
    algorithm AlgorithmIdentifier {{ECDOMAIN-IDENTIFIER-TYPE}},
    subjectPublicKey BIT STRING
    }
    结构体中包含了以下几个元素:
  • algorithm:代表 ECC 公钥所使用的算法类型,通常为 OID(对象标识符)格式。
  • publicKey:代表 ECC 公钥本身的值,使用 BIT STRING 类型进行编码。
  1. 一个 ASN.1 数据结构,用于表示椭圆曲线密码学中的算法标识符
    AlgorithmIdentifier {{ECDOMAIN-IDENTIFIER-TYPE}} ::= SEQUENCE {
    algorithm OBJECT IDENTIFIER {{ECDOMAIN-IDENTIFIER-TYPE}},
    parameters ANY DEFINED BY algorithm OPTIONAL
    }

2.2 OpenSSL验证ECC的ASN.1格式

  1. 生成 ECC 密钥对(例如,使用 secp256r1 曲线):
    openssl ecparam -name secp256r1 -genkey -out ec.key
    image

  2. 将私钥保存为 ASN.1 DER 编码格式:
    openssl ec -in ec.key -outform der -out ec.der
    image

  3. 将公钥保存为 ASN.1 DER 编码格式:
    openssl ec -in ec.key -pubout -outform der -out ec.pub.der

image

  1. 验证 ASN.1 DER 编码格式文件的内容:
    openssl asn1parse -inform der -in ec.der
    openssl asn1parse -inform der -in ec.pub.der

image

使用asn.1viewer查看私钥,格式与描述相符
image

使用asn.1viewer查看公钥,格式与描述相符
image

3. ECDSA算法的ASN.1描述

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线密码学的数字签名算法。与 RSA 等传统的数字签名算法相比,ECDSA 算法使用的密钥长度更短,同时提供了同样的安全级别。因此,ECDSA 算法被广泛应用于移动设备和低带宽网络中。

ECDSA 算法的基本原理是使用椭圆曲线上的点运算来实现数字签名的创建和验证。

3.1 ECDSA的ASN.1表示法

ECDSA 算法的 ASN.1 在 RFC 5480 中进行了定义,具体定义如下:

ECDSA-Sig-Value ::= SEQUENCE {
r INTEGER,
s INTEGER
}

ECParameters ::= CHOICE {
namedCurve OBJECT IDENTIFIER
-- implicitCurve NULL
-- specifiedCurve SpecifiedECDomain
}
其中,ECDSA-Sig-Value 表示 ECDSA 签名的值,包含了两个整数 r 和 s,它们是 ECC 签名生成算法中的变量。

ECParameters 定义了使用的椭圆曲线的参数,分为三种类型:

namedCurve:使用已命名的椭圆曲线
implicitCurve:使用隐式定义的椭圆曲线
specifiedCurve:使用显式定义的椭圆曲线参数

3.2 OpenSSL验证ECDSA的ASN.1格式

3.2.1 生成 ECDSA 密钥对
openssl ecparam -name prime256v1 -genkey -noout -out privatekey.pem
openssl ec -in privatekey.pem -pubout -out publickey.pem
image

image

该命令将生成一个包含私钥的文件 privatekey.pem 和一个包含公钥的文件 publickey.pem

3.2.2 签名和验证消息
使用以下命令对消息进行签名和验证:
使用私钥对消息进行签名:
echo "Hello, world!" | openssl dgst -sha256 -sign privatekey.pem -out signature.bin
使用公钥验证签名是否有效:
echo "Hello, world!" | openssl dgst -sha256 -verify publickey.pem -signature signature.bin

image

4. X.509的ASN.1描述

X.509 是一种公钥证书标准,通常用于在网络上进行身份验证和数据传输的加密。X.509 证书使用公钥加密和数字签名技术,用于证明证书所指定的公钥的拥有者的身份。

X.509 标准定义了证书的数据格式、验证过程、和证书的吊销的相关标准和流程。X.509 证书中包含了许多信息,包括证书的颁发者、持有者、有效期、公钥以及其他其他信息(如证书指纹或主题替代名称等)。

X.509 证书还可以用于 SSL/TLS 协议中,用于验证服务器以及客户端的身份。在 SSL/TLS 加密过程中,服务器会向客户端发送其证书,客户端根据证书验证服务器的身份及证书是否有效。

总之,X.509 证书为数字身份验证提供了一种通用的标准和互操作性,是公钥基础设施的重要组成部分。

4.1 X.5093.1的ASN.1表示法

Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }

TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}

Version ::= INTEGER { v1(0), v2(1), v3(2) }

CertificateSerialNumber ::= INTEGER

Validity ::= SEQUENCE {
notBefore Time,
notAfter Time }

Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }

UniqueIdentifier ::= BIT STRING

SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }

Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension

Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }

Certificate 序列化成ASN.1格式后,分为三个部分:

tbsCertificate:对证书的描述,包括版本号,序列号,签名算法信息和持有者信息。
signatureAlgorithm:签名算法描述。
signatureValue:签名后的值。
TBSCertificate 中的 Version 可以为 0, 1 或 2,分别代表 X.509 v1、v2 和 v3 版本。除此之外,TBSCertificate 包括一些常见的字段:

serialNumber:证书序列号。
signature:签名算法标识证书中数字签名的算法。
issuer:颁发证书的实体,通常是证书颁发机构。
validity:证书的开始和结束时间。
subject:证书所代表的主体实体,通常是一个个体、组织或设备。
subjectPublicKeyInfo:包括证书的公钥和公钥算法标识符。
extensions:可选的扩展字段,用于指定一些额外的信息,如证书链的信息等。
以上就是 X.509 v3 证书的 ASN.1 描述。

4.2 OpenSSL验证X.509的ASN.1格式

4.2.1 生成私钥:
openssl genrsa -out key.pem 2048

image

4.2.2 生成证书签名请求(CSR):
openssl req -new -key key.pem -out csr.pem
image

4.2.3 签名证书请求:
openssl x509 -req -in csr.pem -signkey key.pem -out certificate.pem -days 365
image

4.2.4 检查证书的ASN.1格式:
openssl x509 -text -noout -in certificate.pem
image

4.2.5 验证证书:
image

用asn.1viewer查看私钥格式,与描述相符:
image

用asn.1viewer查看证书格式,与描述相符:
image

参考文献

posted on 2023-06-08 23:20  Zzangg  阅读(146)  评论(0编辑  收藏  举报