RSA算法中的公钥和私钥
定义
公钥私钥是非对称加密中的概念。
在密码学中,密钥(key)是指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息。在对称密码学(或称密钥密码学)中,加密和解密用的是同一个钥匙,因此钥匙需要保密。而在公钥密码学(或称非对称密码学)中,加密和解密用的钥匙不同:通常一个是公开的,称为公钥;另一个保密,称为私钥。
私钥可以有多种表示形式,常见的有 PEM(Privacy Enhanced Mail)和 DER(Distinguished Encoding Rules)等。PEM 格式是一种基于 Base64 编码的表示形式,通常使用 -----BEGIN PRIVATE KEY-----
和 -----END PRIVATE KEY-----
包围。
原理
可以去看 RSA算法原理(一) - 阮一峰的网络日志 这篇博文去了解
编码
公钥和私钥的表示一般有PEM和DER编码,两者可以互相转换
它们通常以 ASN.1 语法来描述
PEM编码
PEM 格式是一种基于 Base64 编码的表示方式,通常带有明确的头部和尾部标识。
示例:
-----BEGIN xxx----- |
DER编码
DER 编码是一种二进制编码格式,使用 ASN.1(Abstract Syntax Notation One), 进行结构化表示。DER 格式没有头部和尾部标识,直接以二进制形式存储数据。
将PEM出头尾内容外,进行base64解密,得到的就是DER编码。
格式
PKCS(Public Key Cryptography Standards, PKCS)涵盖了公钥密码学的各个方面。以下是一些常见的 PKCS 标准:
- PKCS#1:定义了 RSA 加密和签名的标准,包括 RSA 公钥和私钥的格式。
- PKCS#7:定义了加密消息语法标准,用于签名和加密数据。
- PKCS#8:定义了私钥信息语法标准,用于存储私钥。
- PKCS#10:定义了证书签名请求(CSR)的格式,用于申请 X.509 证书。
- PKCS#12:定义了个人信息交换语法,用于存储和传输用户的私钥、公钥和证书。
PKCS的标准详情可以见公钥密码学标准 - 维基百科,自由的百科全书 (wikipedia.org)
PKCS#1 和 PKCS#8 是其中常用的标准。
PKCS#1
PKCS#1 (Public-Key Cryptography Standards #1) 主要定义了 RSA 加密和签名的标准。它包括了 RSA 密钥对的格式、算法和加密方案。以下是一些关键点:
- RSA 密钥格式:PKCS#1 定义了 RSA 私钥和公钥的格式。私钥格式包括模数 (modulus)、公钥指数 (public exponent)、私钥指数 (private exponent) 以及其他参数(如质因数)。
- PEM 编码:在 PEM 格式中,
- PKCS#1 RSA 私钥通常以
----BEGIN RSA PRIVATE KEY-----
和----END RSA PRIVATE KEY-----
包围。 - PKCS#1 RSA 公钥通常以
----RSA PUBLIC KEY-----
和----RSA PUBLIC KEY-----
包围。
- PKCS#1 RSA 私钥通常以
公钥示例:
-----RSA PUBLIC KEY----- |
私钥示例:
-----BEGIN RSA PRIVATE KEY----- |
PKCS#8
PKCS#8 (Public-Key Cryptography Standards #8) 定义了私钥信息语法标准,支持多种类型的私钥(不仅限于 RSA)。它提供了一种通用的格式来存储私钥,并且可以使用加密来保护私钥。
- 私钥格式:PKCS#8 定义了一个通用的私钥格式,可以包含 RSA、DSA、ECDSA 和其他类型的私钥。它使用 ASN.1 语法表示私钥信息。
- PEM 编码:在 PEM 格式中,PKCS#8 私钥通常以
----BEGIN PRIVATE KEY-----
和----END PRIVATE KEY-----
包围。如果私钥是加密的,则以----BEGIN ENCRYPTED PRIVATE KEY-----
和----END ENCRYPTED PRIVATE KEY-----
包围。
私钥示例
-----BEGIN PRIVATE KEY----- |
PKIX
PKIX 公钥格式通常指的是 X.509 标准规定的公钥格式。它们通常以 ASN.1 语法来描述,并可以使用 DER 或 PEM 编码。
在 X.509 证书中,公钥部分通常包含在证书的 SubjectPublicKeyInfo
字段中。这个字段包含了公钥算法标识符和公钥字节。
公钥示例:
-----BEGIN PUBLIC KEY----- |
区别总结
- 适用范围:PKCS#1 仅适用于 RSA 密钥,而 PKCS#8 是一个通用的私钥格式,可以包含多种类型的私钥。
- 格式:PKCS#1 定义了特定的 RSA 密钥结构,而 PKCS#8 使用 ASN.1 语法定义了一种通用的私钥信息格式。
- 加密:PKCS#8 支持对私钥进行加密,增加了私钥的安全性。
RSA算法中的公钥和私钥