You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8下Crypt_RSA迁移至phpseclib3报错求助:签名代表超出范围

PHP 8升级后phpseclib3 RSA签名报错排查

问题背景

升级至PHP 8后,原项目依赖的Crypt/RSA.php已被弃用,改用支持PHP 8的phpseclib3进行RSA签名,但迁移后代码抛出异常。

新旧代码对比

新代码(报错)

$rsa = \phpseclib3\Crypt\RSA::loadPrivateKey($private_key);
$rsa = $rsa->withHash('sha256'); 
$rsa = $rsa->withPadding(RSA::SIGNATURE_PKCS1);
$ans = $rsa->sign("test");
echo $ans;

旧代码(正常运行)

$rsa = new Crypt_RSA();
$rsa->loadKey($private_key);

$rsa->setHash('sha256');     // 指定摘要算法,默认sha1
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);

$signature = base64_encode($rsa->sign($string_to_encrypt));

错误信息

Uncaught OutOfRangeException: Signature representative out of range in xxx

测试密钥

-----BEGIN RSA PRIVATE KEY-----
MIICXwKBAQACgYDWZIPLr6mbty5UIwUnnP8RGjZnrAA1tlQXyqOS89h9LwLwsvlr
8u+1t1iGb+J4wFU34iYTKiHiA2U5Ik5eNnHDR1r9g+UcoM98gQA67D4Ns2+lTHSn
53Bfp/6RvkOPkQq1u6E0zz6bXAXcpZX6kBPIeF4gq+vRj62tprZ90DfuSQKBAwEA
AQKBgKdRfNZbOshPFvYM+rnmud3UEj+oqeVBbbG/sRc//WX9aZMGashHqbKs64bI
DPxmRlu9wC9Ww2jLc5U6Y+T9IpxyCBddx93iiGVFVYxAwYMT16gp/RV5RJOh4779
z7QxDvf3h+pCMLry581Irq+qInVuMKB1NCcdfYYYcoOSLz9tAoFA6lbLDDFA++UN
+xSYUOX4M+QdDpkbKc3R3tRhXRG1hD1s6cT/FZtikoK56XktE8LV9jYbfW78ukK7
mCVenBXwqwKBQOo1ufanHxjW31ntAjgh7wqpDscVW3fOtH5Yb/zbfgp70zNU6S4t
o7CMMvllZq4aJIq+s/afKlLt8r4lRSjRJNsCgUBSsdQvdkYfXgJkAy2JBs5iyXHz
j9YFF4ujHcFKDZDHnMGNcSYvIslTOGyQ1mEw4wWMQCXNSthGhnwawb00SY3HAoFA
UsgCnsebGjB4aVR4QFbeIqp2aq+F0ObirPWdP4ZlGleB4tbURFolTTWAnt3UWR0s
ZU3aVgUT9JPeBI8vzql9mQKBQOX+pnnO5iWu+F2FFzSfM7g3ENCmjSEJ7xBXXUA/
LJVdk0rQRbl1XojjSEGp85NS4EncWo1JFyAXBh7ZC24LAzc=
-----END RSA PRIVATE KEY-----

排查与解决方案

  • 修正常量命名空间引用
    新代码中RSA::SIGNATURE_PKCS1未指定完整命名空间,PHP无法定位该常量,导致padding模式设置错误,引发签名计算异常。需修改为:

    $rsa = $rsa->withPadding(\phpseclib3\Crypt\RSA::SIGNATURE_PKCS1);
    

    或在文件开头添加命名空间导入:

    use phpseclib3\Crypt\RSA;
    

    之后即可直接使用RSA::SIGNATURE_PKCS1。

  • 验证密钥加载状态
    可在加载密钥后添加调试代码,确认密钥是否成功解析:

    $rsa = \phpseclib3\Crypt\RSA::loadPrivateKey($private_key);
    var_dump($rsa->getPrivateKey()); // 输出密钥信息,确认加载成功
    
  • 对齐旧代码的输出逻辑
    旧代码对签名结果做了base64_encode,新代码直接输出二进制数据可能导致展示异常,建议同步处理:

    $ans = base64_encode($rsa->sign("test"));
    echo $ans;
    

内容的提问来源于stack exchange,提问作者Aaron Lee Herng Yue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:10:31