常见问题
公钥和私钥分别用来做什么?
公钥加密、私钥解密(这是本工具的模式)。反过来用私钥签名、公钥验签则是另一套用途,这里不涉及。
2048 位和 4096 位怎么选?
2048 位目前仍然安全且速度更快,是通用选择;4096 位更抗未来算力,但加解密明显更慢、密文更长。
为什么长文本要分段处理?
RSA 单次能加密的明文长度受密钥长度限制,超出必须切块分别加密再拼接,所以同一段长文本会得到一段较长的密文。
关于这个工具
本工具只做一件事:RSA-OAEP(SHA-256)加密 —— 公钥加密、私钥解密。签名与验签(私钥签、公钥验)是另一套用法,这里不提供。
密钥在浏览器本地生成,2048 / 3072 / 4096 位可选。位数越大越慢,3072 位在普通笔记本上通常要几百毫秒到数秒,属于正常。
对外只认两种 PEM:公钥是 SPKI(-----BEGIN PUBLIC KEY-----),私钥是 PKCS#8(-----BEGIN PRIVATE KEY-----)。常见的 PKCS#1 格式(BEGIN RSA PUBLIC KEY、BEGIN RSA PRIVATE KEY)会被拒绝,需要先转换:openssl rsa -in old.pem -pubout 输出 SPKI 公钥,openssl pkcs8 -topk8 -nocrypt -in old.pem 输出 PKCS#8 私钥。
分段长度按密钥算:单块明文上限 = 密钥字节数 − 66(OAEP 用 SHA-256 摘要,占 2×32 字节,再加 2 字节开销)。2048 位是 190 字节、3072 位 318 字节、4096 位 446 字节;超出就按这个长度切块,密文再顺序拼接。切块依据的是实际导入的密钥长度,而不是上面选的位数 —— 粘一把 2048 位公钥却按 3072 位切,加密必然失败。
结果是「每块密文按密钥长度补齐后顺序拼接」再整体 Base64,既不是 PKCS#7 信封也不是 PEM。别的工具要解开它,得按同样的切块规则处理。
RSA 不适合直接加密大段数据:切块带来额外开销,而且它只保证机密性、没有完整性保护。工程上通用的做法是混合加密 —— 用 RSA 包一个临时 AES 密钥,正文交给 AES-GCM。