当前位置: 首页 > news >正文

RSA后台解密报错:javax.crypto.BadPaddingException: Message is larger than modulus

javax.crypto.BadPaddingException: Message is larger than modulus

javax.crypto.BadPaddingException: Message is larger than modulus 是在使用 RSA 算法进行加密或解密时常见的异常。以下是对该错误的详细解释、可能的原因以及相应的解决方法:

错误原因

消息长度超过密钥长度:RSA 算法对明文的长度有限制,如果待加密的消息长度超过了 RSA 密钥所能支持的长度,就会引发此异常。例如,使用较短密钥长度(如 1024 位)的 RSA 密钥加密较长的消息时,可能会出现该问题。
密文块处理不当:在加密过程中,如果消息被分割成多个块进行加密,但在解密时没有正确地将这些密文块拼接或处理,导致最终的密文长度超出了密钥长度的限制,也会引发此异常。
填充方式不正确:RSA 加密通常需要对消息进行填充,以适应加密算法的要求。如果填充的方式不正确或者填充的长度不合适,可能会导致密文长度异常,从而抛出该异常。
解决方法

检查消息长度:确保要加密的消息长度小于 RSA 密钥的长度。如果消息过长,可以考虑使用对称加密算法(如 AES)对消息进行加密,然后将加密后的对称密钥用 RSA 算法加密后传输。
正确处理密文块:在进行加密和解密操作时,要注意正确地处理密文块。可以使用合适的模式(如 CBC、ECB 等)和填充方式(如 PKCS#1Padding)来确保密文的正确性和完整性。
验证填充方式:检查加密和解密时使用的填充方式是否一致且正确。如果填充方式不正确,可以尝试更换其他合适的填充方式,或者手动调整填充的长度和内容,以确保符合 RSA 加密的要求。
综上所述,遇到 javax.crypto.BadPaddingException: Message is larger than modulus 异常时,需要仔细检查代码中关于 RSA 加密和解密的部分,特别是消息长度、密文块处理和填充方式等方面,以确保加密和解密过程的正确性。

报错代码:
@RequestLimit(time = Constants.REQUEST_LIMIT_TIME, count = Constants.REQUEST_LIMIT_COUNT)
    @ResponseBody
    @PostMapping(value = "sendResetPasswordEmail")
    public String sendResetPasswordEmail(HttpServletRequest request, @RequestBody String username) {
        if (StringUtils.isEmpty(username)) {
            return jsonfailed("请输入用户名");
        }
        HttpSession session = request.getSession();
        String privateKey = Utils.toString(session.getAttribute(Constants.Session.PRIVATE_KEY));
        if (StringUtils.isBlank(privateKey)) {
            return this.jsonfailed("没有获取到密钥,请刷新后重试!");
        }
        String decryptUserName = RsaUtils.decrypt(username, privateKey);
        // 发送邮件
        String result = this.userService.sendResetPasswordEmail(decryptUserName);
        if (StringUtils.isNotBlank(result)) {
            return this.jsonfailed(result);
        }
        return this.jsonsucceed();
    }
最后发现是参数问题

前端传参是对象,后台接参是字符串,导致后台解密参数出错

相关文章:

  • 4.1--入门知识扫盲,ISO知识体系介绍(看一遍,协议啥的全部记住)
  • Android Zygote的进程机制
  • nginx配置txt文件点击链接后下载
  • 【ES6新特性】默认参数常见用法
  • (C语言)斐波那契数列(递归求解)
  • uniapp-x vue 特性
  • 通过 API 将Deepseek响应流式内容输出到前端
  • 论文精度:Transformers without Normalization
  • 提示词模板
  • KNN算法性能优化技巧与实战案例
  • vuex持久化存储,手动保存到localStorage,退出登录时清空vuex及localStorage
  • 【数据库】掌握MySQL事务与锁机制-数据一致性的关键
  • Vue:单文件组件
  • Spring Boot 启动顺序
  • k8s-coredns-CrashLoopBackOff 工作不正常
  • QT多媒体播放器类:QMediaPlayer
  • ollama搭建deepseek调用详细步骤
  • flutter 专题 九十八 Flutter 1.7正式版发布
  • EmbodiedSAM:在线实时3D实例分割,利用视觉基础模型实现高效场景理解
  • I211学习笔记
  • 精品消费“精”在哪?多在体验上下功夫
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作
  • “养胃骗局”大公开,真正有用的方法究竟是?
  • 中国—美国经贸合作对接交流会在华盛顿成功举行
  • 沙青青评《通勤梦魇》︱“人机组合”的通勤之路
  • “典孝急乐批麻蚌赢”:互联网“八字真言”与当代赛博赢学