寻求PHP openssl_private_encrypt函数的JavaScript等效实现
PHP中openssl_private_encrypt的JavaScript等效实现
要实现和PHP openssl_private_encrypt 输出完全一致的JavaScript代码,需要匹配其核心逻辑:使用RSA私钥对数据进行PKCS#1 v1.5填充加密,最终输出Base64编码结果。
核心说明
PHP的openssl_private_encrypt默认采用OPENSSL_PKCS1_PADDING填充方式,直接对原始明文进行PKCS#1 v1.5格式填充后用私钥加密,不做哈希处理。原生Web Crypto API不支持该操作(仅支持公钥RSA-OAEP加密、私钥RSASSA-PKCS1-v1_5签名),因此需要借助第三方库jsrsasign实现。
JavaScript实现代码
1. 安装依赖
npm install jsrsasign
2. 实现函数及测试
const { KEYUTIL } = require('jsrsasign'); function opensslPrivateEncrypt(data, privateKeyPem) { // 解析PEM格式RSA私钥 const rsaKey = KEYUTIL.getKey(privateKeyPem); // 执行PKCS#1 v1.5填充的私钥加密,对应PHP默认逻辑 const encryptedHex = rsaKey.privateEncrypt(data, 'pkcs1'); // 十六进制转二进制后进行Base64编码 const buffer = Buffer.from(encryptedHex, 'hex'); return buffer.toString('base64'); } // 测试用例 const inputData = 'RomaxaCoder'; const privateKeyPem = `-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCy745x8AqGKlTWBu2Ub80boPaQxo/midZ4LHZ0zbPpiCAfkADN VYSe8OckPKutdjPX7SNAx66PgQRH1xrz1gysbRrf8K/mA0LQ00MKBFaFottWt5cC IaUS9zvCgPw7prwng3hkGShnvTSMXiKFyt1E3RTvpXRk0u46D6hKiy+TSQIDAQAB AoGBAJe1jjNCDtoz19vi4doBdIhhT8vt3iHbafBX2lMr+MceeAXqpRNy10+e9op9 uh0G4+vGDialZnYbMBLs6Ngl+nVnzn+cN1MMJ18brgf3biZKzVzK9wmOW4eycWaR 9eLa7/+ns8Cw5GsLJdG+OHR2gXRXU4hzUFdf90UUbP+kuqK1AkEA2X04XznFDNmT NuhyCixwinlziazJBp/81jjaBhYj3cG0nTF0Gactc/yD0yudbrMqjLBfts+FbG3Z yFHKrAB/cwJBANKetll3M3aCGsermEK+9hbB8yMihCju6pAwClUNkrAgrm9zU4LP WkC81RDzXbz+pfIqpopfn34F3+U2iMiOe1MCQCXpTgpLZ631v1Oy8S4U0QlSYnF9 TQ16lfhBsL+e3GGrgnBkTniqS6IMQm5tC+RgFuqvU//p7LgZ7fydRVb2P0ECQFp9 YADuKskmutTAj6lVnCtI5upYgQmJJHQQf8/tBfHwCKHPnbic17zqpGwk80go7Ckw U98tmDuv0HMNTBVGygsCQALck7VNBRjL9iFzJMFis+alcP1ZC88wOLPvIxYbevUH c8rZwRqt1aHwaWOoxcVom+tyzRC6gEYoBarmU1bX4No= -----END RSA PRIVATE KEY-----`; const output = opensslPrivateEncrypt(inputData, privateKeyPem); console.log(output);
对应PHP示例代码
<?php openssl_private_encrypt( 'RomaxaCoder', $partialSign, <<<PK -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCy745x8AqGKlTWBu2Ub80boPaQxo/midZ4LHZ0zbPpiCAfkADN VYSe8OckPKutdjPX7SNAx66PgQRH1xrz1gysbRrf8K/mA0LQ00MKBFaFottWt5cC IaUS9zvCgPw7prwng3hkGShnvTSMXiKFyt1E3RTvpXRk0u46D6hKiy+TSQIDAQAB AoGBAJe1jjNCDtoz19vi4doBdIhhT8vt3iHbafBX2lMr+MceeAXqpRNy10+e9op9 uh0G4+vGDialZnYbMBLs6Ngl+nVnzn+cN1MMJ18brgf3biZKzVzK9wmOW4eycWaR 9eLa7/+ns8Cw5GsLJdG+OHR2gXRXU4hzUFdf90UUbP+kuqK1AkEA2X04XznFDNmT NuhyCixwinlziazJBp/81jjaBhYj3cG0nTF0Gactc/yD0yudbrMqjLBfts+FbG3Z yFHKrAB/cwJBANKetll3M3aCGsermEK+9hbB8yMihCju6pAwClUNkrAgrm9zU4LP WkC81RDzXbz+pfIqpopfn34F3+U2iMiOe1MCQCXpTgpLZ631v1Oy8S4U0QlSYnF9 TQ16lfhBsL+e3GGrgnBkTniqS6IMQm5tC+RgFuqvU//p7LgZ7fydRVb2P0ECQFp9 YADuKskmutTAj6lVnCtI5upYgQmJJHQQf8/tBfHwCKHPnbic17zqpGwk80go7Ckw U98tmDuv0HMNTBVGygsCQALck7VNBRjL9iFzJMFis+alcP1ZC88wOLPvIxYbevUH c8rZwRqt1aHwaWOoxcVom+tyzRC6gEYoBarmU1bX4No= -----END RSA PRIVATE KEY----- PK ); var_dump(base64_encode($partialSign));
预期输出
gBeCtvLsVAYI2ubm1Q2GHZoZdCYwGAIoDHxBf4K2O6tJ5FTojHS+n2OkMyNkLuAN93YlnPlefU4WV65OikhdJSghOsT4f8ZER01lweSvPNMgEdEABlHDDv7mWFwNkGi4qvSCgak+xP45G6zPUZJ3uHO5U4Ki1j3WQR0tyrRr5vI=
内容的提问来源于stack exchange,提问作者Roman Bakirov
相关产品推荐
相关产品推荐

