不支持RSA密钥格式解决办法(ValueError:RSA key format is not supported)

本文解决了一个常见错误:从后台获取的pubkey直接使用时出现的ValueError异常,指出RSA key格式不被支持,并提供了解决方案,即如何正确地对pubkey进行格式化处理。

从后台获取到的pubkey直接入参,会出现报错:ValueError:RSA key format is not supported

需要进行以下格式的拼接:

* 计算 32 位整数 * @param {number} b0 - 第一个字节 * @param {number} b1 - 第二个字节 * @param {number} b2 - 第三个字节 * @param {number} b3 - 第四个字节 * @returns {number} 32 位整数 */ function calculate32BitInteger(b0, b1, b2, b3) { return (b0 << 0) + (b1 << 8) + (b2 << 16) + (b3 << 24 >>> 0); } // 检查是否已经是 ZIP 格式 if (crxData[0] === 80 && crxData[1] === 75 && crxData[2] === 3 && crxData[3] === 4) { return crxData; } // 检查 CRX 文件头 if (crxData[0] !== 67 || crxData[1] !== 114 || crxData[2] !== 50 || crxData[3] !== 52) { throw new Error("Invalid header: Does not start with Cr24"); } const isVersion3 = crxData[4] === 3; const isVersion2 = crxData[4] === 2; // 检查版本号 if ((!isVersion2 && !isVersion3) || crxData[5] || crxData[6] || crxData[7]) { throw new Error("Unexpected crx format version number."); } // 处理不同版本的 CRX 文件 if (isVersion2) { const headerSize = 16 + calculate32BitInteger(crxData[8], crxData[9], crxData[10], crxData[11]) + calculate32BitInteger(crxData[12], crxData[13], crxData[14], crxData[15]); return crxData.slice(headerSize); } // CRX v3 处理 const headerSize = 12 + calculate32BitInteger(crxData[8], crxData[9], crxData[10], crxData[11]); const zipData = crxData.slice(headerSize, crxData.length); logger.log("CRX v3: headerSize=" + headerSize + ", ZIP data size=" + zipData.length); // 从CRX头部提取公钥并转换为key字段 let extractedKey = null; try { // 跳过12字节头部,读取公钥长度和签名长度 const publicKeyLength = calculate32BitInteger(crxData[12], crxData[13], crxData[14], crxData[15]); const signatureLength = calculate32BitInteger(crxData[16], crxData[17], crxData[18], crxData[19]); logger.log("Public key length: " + publicKeyLength + ", Signature length: " + signatureLength); // 提取公钥内容(从第20字节开始) const publicKeyData = crxData.slice(20, 20 + publicKeyLength); // 将公钥DER格式转换为Base64 extractedKey = publicKeyData.toString('base64'); logger.log("Extracted key from CRX header: " + extractedKey.substring(0, 50) + "..."); } catch (error) { logger.log("Error extracting key from CRX header: " + error.message); } // 将提取的key注入到manifest.json中 if (extractedKey) { try { const JSZip = require('jszip'); const zip = new JSZip(); await zip.loadAsync(zipData); const manifestFile = zip.file('manifest.json'); if (manifestFile) { const manifestText = await manifestFile.async('text'); const manifest = JSON.parse(manifestText); // 注入key字段 manifest.key = extractedKey; zip.file('manifest.json', JSON.stringify(manifest, null, 2)); const modifiedZipData = await zip.generateAsync({ type: 'nodebuffer' }); logger.log("Successfully injected key into manifest.json"); await writeFile(targetPath, modifiedZipData); return modifiedZipData; } } catch (error) { logger.log("Error injecting key into manifest.json: " + error.message); } } await writeFile(targetPath, zipData); return zipData 这是我的处理方法但是其获得的key很长很长明显不合理
最新发布
08-27
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值