收藏
回答

敏感数据用商户私钥解密失败

https://api.mch.weixin.qq.com/v3/facemch/users

请求实名认证接口返回加密的敏感数据,参考文档https://pay.weixin.qq.com/doc/v3/merchant/4013053265使用商户API证书私钥apiclient_key.pem解密失败

回答关注问题邀请回答
收藏

2 个回答

  • 北望沣渭
    北望沣渭
    1天前

    这个接口返回的数据,字段不是标准APIv3加密的,java需要用 RSA/ECB/PKCS1Padding 去解密

    1天前
    有用
    回复 2
  • Memory
    Memory
    1天前

    给你段代码验证一下,纯html+js本地解密

    html

     <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>RSA 解密</title>
    </head>
    <body>
      <h2>RSA 解密</h2>
    
    
      <h3>上传私钥</h3>
      <input type="file" id="privateKeyFile" accept=".pem" />
    
    
      <h3>输入需要解密的内容(Base64编码的密文)</h3>
      <textarea id="contentToDecrypt"></textarea>
      <button onclick="decryptContent()">解密</button>
      <h4>解密结果:</h4>
      <pre id="decryptedContent"></pre>
    
    
      <script src="https://cdn.jsdelivr.net/npm/node-forge/dist/forge.min.js"></script>
      <script src="decrypt.js"></script>
    </body>
    </html>
    

    decrypt.js

    let privateKey;
    
    
    document.getElementById('privateKeyFile').addEventListener('change', handlePrivateKeyUpload);
    
    
    function handlePrivateKeyUpload(event) {
      const reader = new FileReader();
      reader.onload = function(e) {
        privateKey = forge.pki.privateKeyFromPem(e.target.result);
      };
      reader.readAsText(event.target.files[0]);
    }
    
    
    function decryptContent() {
      const content = document.getElementById('contentToDecrypt').value;
      if (privateKey) {
        try {
          let decrypted;
    
    
          // 尝试 RSA/ECB/PKCS1Padding 解密
          try {
            const decodedContent = forge.util.decode64(content); // 解码Base64内容
            decrypted = privateKey.decrypt(decodedContent, 'RSAES-PKCS1-V1_5'); // PKCS1Padding 解密
            if (decrypted) {
              document.getElementById('decryptedContent').innerText = decrypted.replace(/\n/g, '
    ');
              return; // 解密成功,直接返回
            }
          } catch (e) {
            console.log("RSA/ECB/PKCS1Padding 解密失败,尝试 RSA/OAEP 解密");
          }
    
    
          // 如果 RSA/ECB/PKCS1Padding 解密失败,尝试 RSA/OAEP 解密
          try {
            const decodedContent = forge.util.decode64(content); // 解码Base64内容
            decrypted = privateKey.decrypt(decodedContent, 'RSA-OAEP'); // 使用RSA v1.5/OAEP解密
            if (decrypted) {
              document.getElementById('decryptedContent').innerText = decrypted.replace(/\n/g, '
    ');
              return;
            }
          } catch (error) {
            alert('解密失败,请检查密文或私钥');
          }
          
        } catch (error) {
          alert('解密失败,可能是密文格式不正确或私钥无效');
        }
      } else {
        alert('请先上传私钥文件');
      }
    }
    
    
    
    



    1天前
    有用
    回复 3
    • De l'aube
      De l'aube
      16小时前
      返回”解密失败,可能是密文格式不正确或私钥无效“,这个私钥文件是证书工具生成的,应该不会是私钥的问题吧
      16小时前
      回复
    • Memory
      Memory
      16小时前回复De l'aube
      你需要用请求接口生成签名用的私钥去解密
      16小时前
      回复
    • Memory
      Memory
      16小时前回复De l'aube
      也可以找在线技术支持核对一下https://support.pay.weixin.qq.com/online-service?from=wechatpay
      16小时前
      回复
登录 后发表内容