volacy 2019-10-23 18:40 采纳率: 0%
浏览 3942

RSA解密 Decryption error 问题,很迷惑

使用RSA+AES混合加密传输数据的时候,这是request请求时对入参的处理:

    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type targetType,
            Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
        try {
            RsaType type = RsaType.NONE;
            if (methodParameter.getMethod().isAnnotationPresent(RsaSecurityParameter.class)) {
                //获取注解配置的包含和去除字段
                RsaSecurityParameter serializedField = methodParameter.getMethodAnnotation(RsaSecurityParameter.class);
                //入参是否需要解密
                type =serializedField.type();
            }
            if (type.equals(RsaType.ALL) || type.equals(RsaType.ONLY_DECODE)) {
                String aesKey = "";
                HttpHeaders headers = inputMessage.getHeaders();
                if(headers.containsKey("Aes-Key")){
                    List<String> aesKeys = headers.get("Aes-Key");
                    if(aesKeys.size() == 1){
                        aesKey = aesKeys.get(0);
                    }
                }
                if(StringUtils.isEmpty(aesKey)){
                    throw new Exception();
                }
                String encrptAesKey = RSAUtils.decryptDataOnJava(aesKey,PRIVATE_KEY);
                //需要解密
                return new MyHttpInputMessage(inputMessage,encrptAesKey);
            }else{
                return inputMessage;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return inputMessage;
        }
    }

这是响应时的处理:

public T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {
        try {
            RsaType type = RsaType.NONE;
            if (returnType.getMethod().isAnnotationPresent(RsaSecurityParameter.class)) {
                //获取注解配置的包含和去除字段
                RsaSecurityParameter serializedField = returnType.getMethodAnnotation(RsaSecurityParameter.class);
                //出参是否需要加密
                type =serializedField.type();
            }
            if (type.equals(RsaType.ALL) || type.equals(RsaType.ONLY_ENCODE)) {
                //需要加密
                String aesKey = "";
                HttpHeaders headers = request.getHeaders();
                if(headers.containsKey("Aes-Key")){
                    List<String> aesKeys = headers.get("Aes-Key");
                    if(aesKeys.size() == 1){
                        aesKey = aesKeys.get(0);
                    }
                }
                if(StringUtils.isEmpty(aesKey)){
                    throw new Exception();
                }
                String encrptAesKey = RSAUtils.decryptDataOnJava(aesKey,PRIVATE_KEY);
                //使用aesKey加密响应数据
                return (T) AESUtils.aesEncrypt(JSON.toJSONString(body), encrptAesKey);

            }else{
                return body;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return body;
        }
    }

这两块代码,关于从请求头取出用RSA加密处理后的Aes-Key是一致的。DEBUG打断点观察取到的数据也是一致的,但是在使用RSA解密时,入参的解密是正常没问题的。出参这一块的解密就报javax.crypto.BadPaddingException: Decryption error这个错误。

这是入参时候的处理,这边aes-key是正常解密出来了的。
图片说明
这是出参时候的处理,这边aes-key解密就报错了。
图片说明

包括我在本地调用测试方法也是正常解密的不会报错的。

有没有大神帮忙解释一下?

  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2019-10-23 21:47
    关注

    这么看来跟你目标服务器上 JDK 环境上的 JCE 有关,可能 JDK 环境中没有支持加密的 JCE 。

    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?