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-----
MIICXAIBAAKBgQDF4t0k3qO9u...
-----END 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----- 包围。

公钥示例:

-----RSA PUBLIC KEY-----
MIICXAIBAAKBgQDF4t0k3qO9u...
-----RSA PUBLIC KEY-----

私钥示例:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDF4t0k3qO9u...
-----END 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-----
MIICdwIBADANBgkqhkiG9w0BA...
-----END PRIVATE KEY-----

PKIX

PKIX 公钥格式通常指的是 X.509 标准规定的公钥格式。它们通常以 ASN.1 语法来描述,并可以使用 DER 或 PEM 编码。

在 X.509 证书中,公钥部分通常包含在证书的 SubjectPublicKeyInfo 字段中。这个字段包含了公钥算法标识符和公钥字节。

公钥示例:

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALeW...
-----END PUBLIC KEY-----

区别总结

  • 适用范围:PKCS#1 仅适用于 RSA 密钥,而 PKCS#8 是一个通用的私钥格式,可以包含多种类型的私钥。
  • 格式:PKCS#1 定义了特定的 RSA 密钥结构,而 PKCS#8 使用 ASN.1 语法定义了一种通用的私钥信息格式。
  • 加密:PKCS#8 支持对私钥进行加密,增加了私钥的安全性。
作者

deepwzh

发布于

2024-11-08

更新于

2025-01-16

许可协议

评论