研究人员展示了在受信任的 SSL 证书公钥中直接隐藏虚荣信息(如笑话或文本)的方法。通过操纵 RSA 模数 (n) 以包含特定的 base64 编码字符,网站所有者可以生成一个在数学上仍足以被证书颁发机构 (CA) 签名的证书,同时在任何检查证书原始数据的人面前显示隐藏信息。

展示 RSA 公钥操纵技术的代码列表
研究人员的项目展示了操纵公钥以嵌入数据的各种方法。maurycyz.com

此截图说明了研究中讨论的公钥技巧的技术实现。

虚荣模数的机制

在 RSA 加密系统中,公钥由模数 (n) 和公钥指数 (e) 组成。模数是两个大素数 p 和 q 的乘积。由于模数由用户控制,它可以被视为数据的存储空间。

为了嵌入消息,研究人员的方法首先选择一个随机素数 (p),并计算出一个包含所需消息 base64 编码的目标模数 (n)。由于生成的数值不是 p 和 q 的完美乘积,研究人员通过将目标 n 除以 p 并四舍五入到最接近的素数来计算一个新的 q。

用于虚荣模数生成的技术代码片段
展示用于计算包含嵌入消息的目标模数的逻辑的示例代码。maurycyz.com

此视觉效果提供了用于生成虚荣模数的代码的具体示例。

由于 p 和 q 的大小相似,对 q 的微小更改仅影响乘积的低位部分。这确保了如果消息嵌入在模数的高位部分,它将保持完整且可读。

“生成的 q 值极不可能是素数(或整数),因此我将其四舍五入并找到理想 q 之后的下一个素数:这通常只需要将 q 的值更改几百即可。”

— Horible public key tricks:

获取受信任的证书

一旦建立虚荣模数,研究人员便使用生成的 p 和 q 来构建功能性的 RSA 私钥。该密钥随后可以通过证书签名请求 (CSR) 提交给证书颁发机构。

证书生成和消息嵌入的源代码
额外的代码列表显示了将虚荣模数集成到证书生成过程中的情况。maurycyz.com

此图像补充了在保持功能性的同时修改模数的技术解释。

研究人员展示了可以使用 OpenSSL 和 ACME 客户端(如 Certbot)等标准工具为这些密钥获取有效证书。由于证书的布局是静态的,消息的位置可以不断调整,直到它与 base64 可读性正确对齐。

结果是,该证书在 Web 浏览器中看起来完全正常,但在证书查看器或通过 `openssl s_client` 等命令行工具查看时,包含一段隐藏的字符串。

安全权衡与限制

此技术有意降低了私钥的熵。研究人员指出,虽然这是一种压缩形式,但如果素数 p 和 q 靠得太近,或者私钥指数 (d) 变得太小,理论上可能会使密钥更容易被分解。

然而,对于公共网站,现代 TLS 协议降低了这种风险。由于现代 TLS 提供前向保密,长期 RSA 私钥的泄露不会允许攻击者解密过去的会话;它只会便于中间人攻击。

研究人员承认他们的生成脚本目前不检查这些特定的不安全值,但坚持认为“抗议证书”仍然是加密流量同时对标准证书系统的复杂性发表声明的一种可行方法。