Beryl 发表于 2025-2-17 09:50:19

【求助】RSA的PHP代码转换为JS代码

本帖最后由 Beryl 于 2025-2-17 09:52 编辑

<function decrypted($str){
   //RSA公钥
   $public_key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDP5hzPUW5RFeE2xBT1ERB3hHZI\nVotn/qatWhgc1eZof09qKjElFN6Nma461ZAwGpX4aezKP8Adh4WJj4u2O54xCXDt\nwzKRqZO2oNZkuNmF2Va8kLgiEQAAcxYc8JgTN+uQQNpsep4n/o1sArTJooZIF17E\ntSqSgXDcJ7yDj5rc7wIDAQAB\n-----END PUBLIC KEY-----";
   $pu_key = openssl_pkey_get_public($public_key);

   $key_len = openssl_pkey_get_details($pu_key)['bits'];
   $decrypted= "";
   $part_len = $key_len / 8;
   $parts = str_split(base64_decode($str), $part_len);

   foreach ($parts as $part) {
      $decrypted_temp = '';
      openssl_public_decrypt($part, $decrypted_temp, $pu_key);
      $decrypted .= $decrypted_temp;
      }
      return $decrypted;
   }
这段PHP代码转为JS代码是怎么的?最好给出酷9的或Node.js,可以使用引入库。

evilSays 发表于 2025-2-17 11:03:26

找万能的 deepseek

友善的肥羊 发表于 2025-2-17 12:12:53

nodejs简单,引入crypto库就行,酷9可能无法支持引入外部js库,实现估计得手工实现RSA,那个难度就太大了

友善的肥羊 发表于 2025-2-17 12:13:27

const crypto = require('crypto');

function decrypted(str) {
    // RSA 公钥
    const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDP5hzPUW5RFeE2xBT1ERB3hHZI
Votn/qatWhgc1eZof09qKjElFN6Nma461ZAwGpX4aezKP8Adh4WJj4u2O54xCXDt
wzKRqZO2oNZkuNmF2Va8kLgiEQAAcxYc8JgTN+uQQNpsep4n/o1sArTJooZIF17E
tSqSgXDcJ7yDj5rc7wIDAQAB
-----END PUBLIC KEY-----`;

    // 解析 base64 编码的密文
    const buffer = Buffer.from(str, 'base64');

    // 获取公钥长度(单位:字节)
    const keyLen = 128; // 对于 1024-bit 密钥,字节长度为 128
    const partLen = keyLen;

    let decrypted = '';

    // 逐块解密
    for (let i = 0; i < buffer.length; i += partLen) {
      const chunk = buffer.slice(i, i + partLen);
      const decryptedChunk = crypto.publicDecrypt(
            {
                key: publicKey,
                padding: crypto.constants.RSA_NO_PADDING, // 与 PHP 保持一致
            },
            chunk
      );
      decrypted += decryptedChunk.toString('utf8');
    }

    return decrypted;
}

// 示例调用
const encryptedString = "your_base64_encrypted_string_here";
console.log(decrypted(encryptedString));

Beryl 发表于 2025-2-17 14:43:45

友善的肥羊 发表于 2025-2-17 12:12
nodejs简单,引入crypto库就行,酷9可能无法支持引入外部js库,实现估计得手工实现RSA,那个难度就太大了 ...

酷9最新版支持引入库了,但是没有例子,不知道怎么用法。//加密库引用示例
const CryptoJS = require( "crypto" );
const jsencrypt = require( "jsencrypt" );
let base64String = "" ; //url Base64编码
let url = CryptoJS.enc.Base64.parse(base64String).toString( CryptoJS.enc.Utf8);
const response = ku9.request( url );这是内置的示例,const CryptoJS = require( "crypto" );用其他代码试过了没问题。const jsencrypt = require( "jsencrypt" );不知道怎么用法。 另外JS里:const keyLen = 128; // 对于 1024-bit 密钥,字节长度为 128,JS这样设置128不知是否正确。

tqx5201 发表于 2025-2-17 16:36:04

本帖最后由 tqx5201 于 2025-2-17 20:14 编辑

//ku9调用示例
function main(item) {
const JSEncrypt = require("jsencrypt");

// 创建一个新的JSEncrypt实例
const encryptor = new JSEncrypt();

const privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgG0NgggMs1iSD9+SZ6FYLJ8RtbxBsFWQDegN5/EAtXi4ZeFf9J7y
Z27T2TZRysBvkqiJhs/jJT6RYmwaCFQ8n98uboedEqyfn6GYqbdA288no3z+y6bY
BRcJjEMocLqKEtyZc8PAF1Shas+7JiZkRSNj7n9tnu9cnit1Vbps2z7xAgMBAAEC
gYAyGCdoPTVRdV8XS3CRPCjbNU5vWRmAZHkO5Pxrx/CUsNgUDHkZXq7GyUgZXL8v
YNFU3D/yVRxxvmUg1WCIGYUyat1XXDNpPqc7eVjHi7yl+ybr5LfhYhL580vMtFHP
XTMRQap8wKs554oEO4f5OO0TAuTLztBM9xlg2+yDWyWKAQJBAMvM3dqYcnnpyKAA
apsto8ZlXInbLp7iUUtkb5AJZHTte7wGnJuFAoVNnqwVEaKRleykN/ESALALnfsc
/uihmCECQQCI/BI4sAIoxH+EcNyzqJfwKbweIwXByy1MBdRKprDIF2uOY0swK62C
GRhIhgqR+hCTBZ2N8qmURlxq8i86PIzRAkEAlRj6LdRd28cnWbc0Rvbq3FiHjOtn
fiHAq9F8tPnKHqknXvXPWQ/EOlYBAZAgaLjt4ER8EMfE7QZyu6YI75RZQQJAE2DN
VxWXCJtbiqnInuWvsLrGsOC1dMfAPavpbzILehLOFVN4lHTpU6knJUNJBYOBirrV
ofn9AUu+0SY3hh6AsQJBAJm9BB9lwEi2kgRdJMnFa/IOG1AvJ50ORAWi2YiuD5kA
Lx7FizyLfgSKY8rNmlsJFl+gGmQ+FdHJT7VaJBriFfw=
-----END RSA PRIVATE KEY-----`;
encryptor.setPrivateKey(privateKey);

var encrypted ='HhfVVAQHRFYOdKPEpkSCp/4wdhk5R85qkKcmK/Fn4wnKC+Bq+4kAuBnBdUJ4wfs4oZNogR99APOTOZyJ1cgOf0zzHq3Zm1AkHq3dQ5fhlf0vMDhiC3kwIRfLeUxE6Vf1I6thSvCKoAECeOxKYy2KTbGDIdYnViBRE/qfks4LD/w=';
      
//私钥解密 ,网上说公加私解,私加公解,但我测试只能公加私解,私加私解,不是私加公解
let decrypted = encryptor.decrypt(encrypted);
//console.log("解密后的数据是hello:", decrypted);
return { url: 'http://xxx.com/'+decrypted+'.m3u8'}
}

zxwwp 发表于 2025-2-21 07:47:44

学习学习 !!

datonnn 发表于 2025-2-21 13:38:19

学习楼上几位的
页: [1]
查看完整版本: 【求助】RSA的PHP代码转换为JS代码