java.security.InvalidKeyException: IOException : DER input, Integer tag error关于RSA解密碰见的天坑

这篇具有很好参考价值的文章主要介绍了java.security.InvalidKeyException: IOException : DER input, Integer tag error关于RSA解密碰见的天坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

der input, integer tag error,第三方服务,后端,android

        安卓开发中手机号一键登入,需要得到本机号码,号码有三大运营商,所以用的时极光平台,帮我们封装好了。客户端通过认证Android SDK 后获取loginToken给服务端,服务端拿到loginToken调用一键认证Api获取加密的手机号(基于RSA公钥),需要用对应的RSA私钥解密,但出现了java.security.InvalidKeyException: IOException : DER input, Integer tag error这个问题,意思是私钥格式不对,处理了半天,避免大家踩坑,总结出这篇文章。


问题描述

对获取到加密的手机号进行解密报的异常,先看官网的解密方案:

官方文档

der input, integer tag error,第三方服务,后端,android

官方是使用了RSA的私钥对加密的手机号进行解密,

什么是RSA?

  • 计算机中常用的加密技术分为两类:对称加密、非对称加密。

  • RSA属于非对称加密。加密、解密过程使用不同的秘钥,分为公钥、私钥。公钥可以公开,私钥不可以。

  • 对称加密:加密和解密使用相同的的秘钥Key,这个Key需要在网络上传输,不安全,因此需要非对称加密 

    我们服务端通过loginToken获取的手机号就是通过公钥来加密的,需要使用对应的私钥来进行解密,这里提供RSA相关的加解密工具网址 RSA加解密工具

der input, integer tag error,第三方服务,后端,android        于是我应开发的需求,生成了一对带密码的RSA公私钥对(可以设置无密码,就是随机生成,但我设置了密码,就是这个行为让我报了半天的错误)der input, integer tag error,第三方服务,后端,android

        为了验证生成的密钥对能否对症成功,我在RSA加解密工具验证的时候,发现需要带密码才能验证成功,可上面是说密码可写可不写,我当时没有在意,就任他发展,让我苦逼的在后面。


我的代码实现1

package com.lyj.biz.converter;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;

/**
 * @Author liyingjie
 * @Date 2022/12/3 1:11
 * @Version 1.0
 */
public class RSATest {
    public static void main(String[] args) {

        //RSA私钥
        final String  JVERIFY_PRIVATE_KEY="MIIC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIM5nBmtpZeEQCAggA" +
                "MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBQ9OWtLaOumZtlrURZgNjiBIIC" +
                "gIK6eSC4EUaVGJPzOMTvDEnpsCvPIMpuIgPnpQldlF5z3qhoxVJ9fbYiuSeZuYz7" +
                "FM50OL2YdfcW2ajY4UcE0OlA+GVPR61fCcvr0PXYrQDjrXVQ24U52kfzxqsRlu4q" +
                "LnHPdNZwI8FHA5eBp" +
                "Q6f9xosqFmkhGXoENZV1cxseuT5hhcC6389V5GWG/gmtxy/ff01oHgzi1s5n6BdC" +
                "9jU9ju2VfwrQn2NxygNARtMajEtWL1/pk4vmtu694zPTv7SJe2bgMPIdh5uH6ZLT" +
                "dbrJSXLfwaNM39BWYJG4ZzcPl58yE8QqA6+mRkkCwvdV9n/Vs9uwXRHE3DfH1O11" +
                "ZtQax5TGpEHa+XUdG6p+3ktYJmm2NUoy3ED2bVYX54" +
                "fDXGh2/tV4wO+ohnpaLY6EaXf0vKWNrSzmUILahx0BcE/MY6Ea6hWemXuJFbxASD" +
                "Zb4EtYbMsa5/RDAueagGuDzWFOx957/868ZcYUhs9gEozCq8WQ8WCQ6wKHoI3L3W" +
                "RxQo7ROBDQ/fu0rqvT7Z5h2fMtXbiyybYkoV3TjxQP4RUCypTC2hgKK/owU4/FUG" +
                "GJzLPRe2jZBeWrlqgVmKo1zLdYu6EOQ/Z7pERUbmIOnXPDWeLx7fxJCCPlSLfVWb" +
                "5b37YOAZxP98kpR3tm/pXT/dDnZu3j7hmu+kldwajxwY+NNagVqwIfrUs5LOjq58" +
                "Eq7KcrwvSj0ymufRm13Z2hVFepn+y5W+pDIoTNLl8mBZNI0H3TlsV89NltTvp0TT" +
                "bUMXPCljfsaXNa2O7DGnVsk=";
        //RSA公钥
        final String  JVERIFY_PUBLIC_KEY="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADC"+
                "BiQKBgQCS5mh332H7gtyJuwWtGk7DEG9J3xejIY23J"+
                "0KpGsAUuSV9WrBYasDf"+
                "jv6GIUeDCBIo+VxKfYJ2doRI53T3kQ9s"+
                "k8N8rvDpLerhYkyD0z0lIhc5pypsW1lgbSoEQOliS/BSdIp6MOFdwIDAQAB";
        //加密后的电话号码(RSA加密)
        String phoneToken = "fVPnF7Ux+s1NNFrJalt+nK4oOjS+CTt/5OUca5aIfBXcfeAouPJ4Bt96iIT91hjpMvAMshixCiuX5NK9he9OrtUfkRf"+
                "/mW3veLn75HJ2hQLZwwVAJ9R3AJVXgN1XMU1Kr1tWtEvdo1U1nCR9WNaYp0u4FSnrQijHjAyxMbITwfg=";

        //返回解密后的电话号码(通过私钥解密)

            RSA rsa = new RSA(JVERIFY_PRIVATE_KEY, JVERIFY_PUBLIC_KEY);
            byte[] decrypt = rsa.decrypt(phoneToken, KeyType.PrivateKey);

        System.out.println(StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));


    }
}

结果:

der input, integer tag error,第三方服务,后端,android

 我是通过公钥和私钥一起来对密文进行解密的,结果报错:意思是识别不到你的私钥,不自信的我开始以为是没有使用官方答案,于是我借鉴官网的方案

package com.lyj.biz.converter;

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

public class RSADecrypt {public static void main(String[] args) throws Exception {
    //加密手机号
    String encrypted = "fVPnF7Ux+s1NNFrJalt+nK4oOjS+CTt/5OUca5aIfBXcfeAouPJ4Bt96iIT91hjpMvAMshixCiuX5NK9he9OrtUfkRf/mW3veLn75HJ2hQLZwwVAJ9R3AJVXgN1XMU1Kr1tWtEvdo1U1nCR9WNaYp0u4FSnrQijHjAyxMbITwfg=";
    //RSA对应私钥
    String prikey =
            "MIIC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIM5nBmtpZeEQCAggA" +
                    "MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBQ9OWtLaOumZtlrURZgNjiBIIC" +
                    "gIK6sCvPIMpuIgPnpQldlF5z3qhoxVJ9fbYiuSeZuYz7" +
                    "FM50OL2YdfcW2ajY4UcE0OlA+GVPR61fCcvr0PXYrQDjrXVQ24U52kfzxqsRlu4q" +
                    "L5muocW0MVe5PIswm9tcwzbx6zIXQAiINyYgtFmNZaIichhMnHPdNZwI8FHA5eBp" +
                    "Q6f9xosqFmkhGXoENZV1cxseuT5hhcC6389V5GWG/gmtxy/ff01oHgzi1s5n6BdC" +
                    "9jU9jvmtu694zPTv7SJe2bgMPIdh5uH6ZLT" +
                    "dbrJSXLfwaNM39BWYJG4ZzcPl58yE8QqA6+mRkkCwvdV9n/Vs9uwXRHE3DfH1O11" +
                    "ZtQakSqY8PKPTMvfahwz9yWrVQx5TGpEHa+XUdG6p+3ktYJmm2NUoy3ED2bVYX54" +
                    "fDXGh2/tV4wO+ohnpaLY6EaXf0vKWNrSzmUILahx0BcE/MY6Ea6hWemXuJFbxASD" +
                    "Zb4EtYbMsa5/RWQ8WCQ6wKHoI3L3W" +
                    "RxQo7ROBDQ/fu0rqvT7Z5h2fMtXbiyybYkoV3TjxQP4RUCypTC2hgKK/owU4/FUG" +
                    "GJzLPRe2jZBeWrlqgVmKo1zLdYu6EOQ/Z7px7fxJCCPlSLfVWb" +
                    "5b37YOAZ+kldwajxwY+NNagVqwIfrUs5LOjq58" +
                    "Eq7KcrwvSj0ymufRm13Z2hVFepn+y5W+pDIoTNLl8mBZNI0H3TlsV89NltTvp0TT" +
                    "bUMXPCljfsaXNa2O7DGnVsk=";

    String result = decrypt(encrypted, prikey);
    System.out.println(result);
}

    public static String decrypt(String cryptograph, String prikey) throws Exception {
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(prikey));
        PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

        Cipher cipher=Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        byte [] b = Base64.getDecoder().decode(cryptograph);
        return new String(cipher.doFinal(b));
    }
}

 结果还是报错der input, integer tag error,第三方服务,后端,android

         一开始我是纠结是不是我的密钥格式不正确,接着去查又说什么jdk的security版本不兼容了,后面我就研究那个生成工具,意识到可能是设置了密码问题,设置密码后的每次使用几乎都要带上密码,否则就是失败。

于是我抱着尝试的心态,把之前私钥的密码给清除了der input, integer tag error,第三方服务,后端,android

 运用生成好后的私钥,替换代码中先前的私钥,果然,十分顺畅,完美解决

der input, integer tag error,第三方服务,后端,android

 无论是官方的还是自己的都行的通,成功解密出对应的手机号der input, integer tag error,第三方服务,后端,android

 如果需要清除RSA密码的可以通过私钥在在线RSA私钥密码添加、修改、清除工具-ME2在线工具 (metools.info)修改删除,公钥主要用于加密,私钥用于解密,所以公钥可以公开,私钥记得妥善保管。


总结解决方案:

        如果碰见和我同样的问题,建议拿到私钥后去RSA在线工具修改清楚掉密码,RSA公私钥对请妥善保管,文章来源地址https://www.toymoban.com/news/detail-781831.html

到了这里,关于java.security.InvalidKeyException: IOException : DER input, Integer tag error关于RSA解密碰见的天坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决Java中的IOException异常

    IOException是Java中的一个受检查异常(Checked Exception)。它是java.io包中定义的异常类之一,用于表示输入输出操作期间可能发生的错误或异常情况。 IOException继承自Exception类,并且是许多其他与输入输出相关的异常类的基类。它是一个广泛的异常类,用于处理与输入输出操作相

    2024年02月15日
    浏览(137)
  • Java中Integer方法

    本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。希望能对大家能有所帮助,同时也是请大家对我进行监督,对我写的代码进行建议,互相学习。 Integer类提供了许多方法来操作整数值。 定义 分析

    2024年02月14日
    浏览(47)
  • Java --- Integer.parseInt()

    parseInt() 方法是java.lang 包下Integer 类的一个方法。 Java Integer parseInt() 方法共有三种不同类型,可以根据其参数进行区分。 以下是 parseInt() 方法的声明: 数据类型 参数 描述 必需/可选 String s 它是一个需要转换为等效整数的字符串。 Required int radix 解析字符串时使用的基数 Re

    2024年02月16日
    浏览(36)
  • java Long 转Integer

    要将 Java 中的 Long 类型转换为 Integer 类型,您可以使用 Integer 类中提供的 intValue() 方法。 例如,假设您有一个 Long 类型的变量 longValue,您可以使用以下代码将其转换为 Integer 类型: 请注意,如果 Long 类型的变量 longValue 超出了 Integer 类型的范围,即超过了 -2147483648 到 21474

    2024年02月11日
    浏览(38)
  • 在Java中将Double转换为Integer

    首先,初始化一个double值 现在,使用intValue()方法将Double转换为Integer值 以下是在Java中将Double转换为Integer的程序 输出结果

    2024年02月08日
    浏览(43)
  • 【方案探讨】 出现java.io.IOException解决方法

    欢迎来到我的博客!在这里,我将分享我对问题的独特见解和解决方案。通过这篇博客,我希望能够为您带来新的思考方式,启发您寻找问题的不同角度,并探索创新的解决方案。 每个问题都是一个机会,是一个学习的过程。在这里,我将分享我对问题的思考过程和解决方案

    2024年04月25日
    浏览(47)
  • java.io.IOException: Broken pipe管道断开

    一、Broken pipe产生原因分析 1.当访问某个服务突然服务器挂了,就会产生Broken pipe; 2.客户端读取超时关闭了连接,这时服务器往客户端再写数据就发生了broken pipe异常! 3.端口冲突,地址已被使用,也会导致Broken pipe 二、方案 1.问题一分析服务器为什么挂了。 2.问题二使用jp

    2024年02月10日
    浏览(49)
  • Java转换为十进制——Integer.parseInt的使用

    一、什么是Integer.parseInt Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据,如果遇到不能转换的字符则会抛出异常! 简而言之,这个代码就是用来把任何进制的数据转化成10进制的数据。 二、使用方法 格式为:Integer.parselnt(\\\"String\\\",目前的进制) (1)以Java九进

    2024年02月14日
    浏览(43)
  • Java中判断Integer是否为null的详细解析

    简介 在java编写过程中,我们会使用到各种各样的表达式,在使用表达式的过程中,有哪些安全问题需要我们注意的呢?一起来看看吧。 来看看小编挑选的这本书对你是否有用: 注意表达式的返回值 我们在使用JDK库的时候,一定要注意认真的读一下JDK中方法的含义和它的返

    2024年02月13日
    浏览(38)
  • java.io.IOException: Connection reset by peer

    接口返回的时候报错,java.io.IOException: Connection reset by peer,具体报错信息如下: 原因: 接口返回的数据量太大报错, 解决办法: 修改nginx缓存配置信息。 nginx原配置信息: nginx修改后信息: 注意: \\\"proxy_busy_buffers_size\\\"必须等于或大于\\\"proxy_buffer_size\\\"的最大值。

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包