收藏
回答

微信信息解密,偶先解密失败

问题类型 API/组件名称 终端类型 微信版本 基础库版本
Bug 不知 鸿蒙客户端 8.0.17 3.15.2

https://developers.weixin.qq.com/miniprogram/dev/server/API/user-login/api_code2session.html


通过这个接口获取的session_key解密,偶尔解密会报 Given final block not properly padded. Such issues can arise if a bad key is used during decryption.

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

2 个回答

  • 一直善良下去
    一直善良下去
    05-22
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
    
    /**
     * 微信解密工具
     */
    public class WXDecryptUtils {
        /**
         * 解密微信加密数据
         *
         * @param encryptedData 加密数据(Base64编码)
         * @param sessionKey    会话密钥(Base64编码)
         * @param iv            初始向量(Base64编码)
         * @return 解密后的JSON字符串
         * {
         * "phoneNumber": "13800000000",
         * "purePhoneNumber": "13800000000",
         * "countryCode": "86",
         * "watermark": {
         * "appid": "wx1234567890abcdef",
         * "timestamp": 1601234567
         * }
         * }
         */
        public static String decryptData(String encryptedData, String sessionKey, String iv) {
            try {
                // Base64 解码
                byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData);
                byte[] keyBytes = Base64.getDecoder().decode(sessionKey);
                byte[] ivBytes = Base64.getDecoder().decode(iv);
    
                // 初始化AES解密器
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
                IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
                cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    
                // 解密并转成字符串
                byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
                return new String(decryptedBytes, StandardCharsets.UTF_8);
            } catch (Exception e) {
                // 添加详细的错误日志,便于调试
                Log.error("微信解密失败 - encryptedData: {}, sessionKey: {}, iv: {}, 错误: {}",
                        encryptedData,
                        sessionKey,
                        iv,
                        e.getMessage());
                throw new RuntimeException("解密失败: " + e.getMessage(), e);
            }
        }
    }
    


    05-22
    有用
    回复
  • 智能回答 智能回答 本次回答由AI生成
    05-22
    有用
    回复
登录 后发表内容