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

PHP8迁移:phpseclib3替代Crypt_RSA实现RSA私钥加密遇阻

解决phpseclib3中用RSA私钥加密字符串的问题

核心逻辑说明

旧版phpseclib允许私钥调用encrypt(),本质是用私钥内置的公钥部分执行标准RSA加密操作。phpseclib3做了更严谨的职责划分,公私钥对象各司其职,因此需要手动对齐旧版逻辑。

方法1:从私钥提取公钥后加密(推荐)

这是最贴合旧版代码行为的方案,代码示例:

use phpseclib3\Crypt\PublicKeyLoader;

define('RSA_PRIV_KEY', "<base64 encoded key>");

// 加载私钥
$privateKey = PublicKeyLoader::loadPrivateKey(RSA_PRIV_KEY);
// 从私钥中提取公钥实例
$publicKey = $privateKey->getPublicKey();
// 用公钥执行加密,结果与旧版私钥encrypt()完全一致
$encrypted = $publicKey->encrypt("my fancy string");
$result = base64_encode($encrypted);

方法2:手动执行RSA加密运算(仅为严格对齐旧调用形式)

如果业务要求必须通过私钥对象完成加密操作,可手动实现RSA加密的底层逻辑:

use phpseclib3\Crypt\PublicKeyLoader;
use phpseclib3\Math\BigInteger;

define('RSA_PRIV_KEY', "<base64 encoded key>");

$privateKey = PublicKeyLoader::loadPrivateKey(RSA_PRIV_KEY);
$message = "my fancy string";

// 获取RSA算法核心参数:模数n、公钥指数e
$n = $privateKey->getModulus();
$e = $privateKey->getPublicExponent();

// 手动执行RSA加密:明文m的e次方取模n
$m = new BigInteger($message, 256);
$c = $m->modPow($e, $n);

// 转换为二进制并base64编码,得到最终结果
$encrypted = $c->toBytes();
$result = base64_encode($encrypted);

OpenSSL替代方案

若想用OpenSSL实现相同逻辑,同样需要先从私钥提取公钥再加密:

define('RSA_PRIV_KEY', "<base64 encoded key>");

// 加载私钥
$privKey = openssl_pkey_get_private(RSA_PRIV_KEY);
// 提取公钥详情
$pubKeyDetails = openssl_pkey_get_details($privKey);
$pubKey = $pubKeyDetails['key'];

// 公钥加密并编码
openssl_public_encrypt("my fancy string", $encrypted, $pubKey);
$result = base64_encode($encrypted);

内容的提问来源于stack exchange,提问作者user2662314

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:01:01