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
相关产品推荐
相关产品推荐

