真实事件以熵不足为主。Debian 的 OpenSSL 软件包(CVE-2008-0166,2006~2008年)几乎只用进程 ID 作为随机数生成器(RNG)的种子,因此每种密钥类型和长度只存在约 32,768 个密钥;一些 SSH 工具至今仍附带这些密钥的黑名单。刚启动就生成密钥的设备会重复或共用素数:2012年,Heninger 等人对数以百万计的模数计算最大公约数(GCD),分解了约 0.5% 的 TLS 主机的 RSA 密钥。
结构性缺陷:ROCA(CVE-2017-15361)使英飞凌(Infineon)库生成的 RSA 密钥因其特殊的素数结构而可被分解,影响了智能卡、TPM 和爱沙尼亚身份证;2022年,人们发现一个商业库生成的素数彼此过于接近,用费马分解法能瞬间分解模数(CVE-2022-26320)。对于椭圆曲线,弱密钥来自有偏差的 nonce 和糟糕的随机性,而非密钥本身。
验证者或 CA 可以执行的检查:指纹黑名单(Debian)、ROCA 指纹测试、针对已知模数的批量 GCD、针对相近素数的费马分解、不小于 65537 的公钥指数,以及最小长度要求。弱密钥检测工具会在本地运行这些测试。