
phpseclib 3 默认使用 SHA256 作为 OAEP 哈希算法,而 phpseclib 2 使用 SHA1,导致相同密钥和密文在 v3 中解密失败;需显式指定 withHash("sha1") 和 withMGFHash("sha1") 实现向后兼容。
phpseclib 3 默认使用 sha256 作为 oaep 哈希算法,而 phpseclib 2 使用 sha1,导致相同密钥和密文在 v3 中解密失败;需显式指定 `withhash("sha1")` 和 `withmgfhash("sha1")` 实现向后兼容。
在从 phpseclib 2 升级到 phpseclib 3 的过程中,RSA 解密逻辑看似简洁(仅更换命名空间与加载方式),却常因底层默认参数变更而静默失败——典型表现是 decrypt() 返回 false 或抛出异常,而密文、私钥本身并无错误。
根本原因在于:OAEP 填充的哈希算法不一致。
- phpseclib 2 默认采用
SHA1作为主哈希(hash)和掩码生成函数哈希(MGF1 hash); - phpseclib 3 为提升安全性,默认统一升级为
SHA256。
由于 OAEP 是确定性填充方案,hash与mgfHash必须与加密时完全一致,否则解密必然失败——即使密钥正确、编码无误。
✅ 正确的 phpseclib 3 兼容写法如下:
use phpseclib3\Crypt\PublicKeyLoader;
$private = PublicKeyLoader::load($PRIVATE_KEY);
// 显式指定与 v2 兼容的哈希算法
$decrypted = $private
->withHash('sha1')
->withMGFHash('sha1')
->decrypt(base64_decode($a));
if ($decrypted === false) {
throw new RuntimeException('RSA decryption failed: invalid padding or hash mismatch');
}⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
-
withHash()和withMGFHash()必须同时设置,缺一不可; - 这些方法返回新实例(immutable),因此需链式调用或重新赋值;
- 若原始密文由 phpseclib 3(或 OpenSSL + SHA256 OAEP)加密生成,则应保持默认 SHA256,而非降级至 SHA1;
- SHA1 在 OAEP 场景中暂无已知实用攻击(参见 Security StackExchange 分析),但长期建议逐步迁移至 SHA256 —— 只需确保加解密两端配置一致即可。
? 迁移建议:
优先修改加密端,统一使用 SHA256 OAEP(如 ->withHash('sha256')->withMGFHash('sha256')),再同步更新解密逻辑。此举既符合现代密码学最佳实践,也避免未来因 SHA1 全面弃用带来的兼容性风险。



















