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个回答

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

qq_25097641
chuyun_lh 但是出入参的处理逻辑都在这个服务器上啊。会出现一个正常一个报错的现象吗。
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐