java中der格式PKCS1规范RSA解码

最近在帮公司把go中部分功能迁移到java,涉及到一个登录功能,使用rsa对登录密码进行加密,但是从数据库里取出来的私钥是der格式的且看go那边的解密代码是PKCS1规范,java中通常用的是PKCS8规范,刚开始在网络上搜一直是再找将PKCS1转化为PKCS8的方案,然后一直有问题,后来直接使用bouncycastle包里的功能进行解密的。代码如下:

<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpg-jdk15on</artifactId>
            <version>1.60</version>
        </dependency>

Security.addProvider(new BouncyCastleProvider());
        String hexStr = "308204a50201000282010100a8377ed71b33fd7aef1c095127e331cd62f1a1c986c10b2c6bbf15a0b93a068fd6fe90c4a6a218b6e04cca2811786d086e2cb06af9e08bdabe0242447f23f2e100ffad9434b13b9ea0457204cac8e65fff3108ba9dc59587b59203a25f7de8b1731aafa6ca3a992493e10d2043b4a7d412a9737c5624b97ac59d782a9829f966929b7431075ecf6566d522f09ecca3d40b1acd53b79581a04bf3ec7c97151a5035cb97fc490feb003c113d4fece38028f039762ca46333b5c85278a59e96955b719b922b73921701f1b857c89a3efad5ba952b7bbee48aeebcb6bbbcc0ccc55ee7e238ba4e57463fdae7a309f86709e1b89e6cdf13f5706d2f083e163184397f02030100010282010100a27997a5a4bcbea432b75db86952641400f16a5700350cd9c6e835b79bb0940df296c6b56a4d3e99c463e70e747160beb7cbaa4a69379d5d96111078a064d47ec73c2d27ed0d128cd038c33c25b18df242c5d5ac8a1f01a2a69975b12b92ad6257cefac19aaaa6a851bd19b48430c5b96c9d06d29d51b36505e266e29d3e4d8857e0a7b20d32af1b35bf9e1c123ce83b060d1e8814f37eb58af0682e10e5b004777deeef45febac838df554a23461ba6a06352b028dd047463951cecfedf0ce8f2de840777acd35e500116c4b72b7db36ddf2bb17fce3142f9198650743e1f0d54ccdc5858cd90f1957898baaae217fe619a3640355b7f04061228fc72474d6102818100c64b733a75b958d22b8d74d53da6ca388e372ee981e6cbad9267d9e56589cbb1eeaf7984bd7c4152686e107c15557fbf7c5ddb1c215b9904a6b4f749ef2bdbf7008719d755b390b50f737f14b725eb93f116068e23da6ddce0157e7b5a8289d9b12fcdb7c5430efbf340b565cceac1eb4eaf5761743ad2e2ee6e187f0f855ceb02818100d92b4cce4d0977bf95d3b972bfecafdae04372d875257368809cd5e27e28bcc220ba7b3ca0042fb9af908bf5470769f280df5484dbb0d36b32c1b931410255d6e91d6fbf2d44bbfebc51fcb48ae25ca2b894cc80975e5bd4e1a4868b8f7b72123a85a2b7e818345b5a07c54c8a7d522b1456e031b0e4d5ef4e264a9bdc03e0bd028181009525ff1fc3988bd45969e6acd5d8745621b2241902da23ed042814ded486d6ad990867708e4dbd9c4c6c2cfe07d5ed668c16d44dce516540f85b397d64e62a67190085515066e5bb2a4a0715ffc407f398eca63597861e087a8bf03cbc115fba5be9c6e428fd8d71b8bfbd313af680b18ad79bf3f346a384892e4a4297dc09cd02818100850b67f48371a771320311fbe0e4ca1f9780fadced77d22a5590bfe0105638bddd7b2180d4af7be5904f47cf2e82b63fa10031316bbdfae813a267286ba158a15f136fa079c5403f21744113027b0731914f67b1e80a20cc5ca884dcff3c2b784b6e0f7007babc68b2d14be84677dc5d140add32d4227d862c247d54db076d290281806bf62c353941e2e2934de0db316f84d478c768897375c13411aeafef03f604f957ffb7537838459a5eb1d0743d776b0b5c0ce774753147cfdca7d6b856713701c16bef951f4f98f6e7fac8ded13d8673df5fcac4cdbf9de9d3f896287b20dac42a61131d1a9b2df449bd3afbc82a761f192d99bb36f545d674f40bc2a6cba95b";
        RSAPrivateKey rsaPrivateKeyStructure = RSAPrivateKey.getInstance(ASN1Sequence.fromByteArray(Hex.decode(hexStr)));
        RSAPrivateKeySpec rsaPrivateKeySpec = new RSAPrivateKeySpec(rsaPrivateKeyStructure.getModulus(),rsaPrivateKeyStructure.getPrivateExponent());
        KeyFactory keyFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider());
        PrivateKey privateKey = keyFactory.generatePrivate(rsaPrivateKeySpec);
        String cipherText = "hPRIJ2eF6fLqDI9g35nQxarXd9QHFfJu1+EgSkDJfGVptzZmV6dUgXE6NDJXQAv9RoWFr83VufNyXxBwgefnpc+Y3EieBGiJqzemGrYKZrMX9QmK8oIlnThelQ9wTh1lNvHXrtgLVTMhegd0RLJJ00sB2zWuA6DKmLGFIf3D2Di2jf3aMeAbqm0XUjMQtJ4NXpVZ8hx3jtCfyrBJk0DnKmN7arzW6eNJFmg87jn3ZR7XcvVJNo6r1GFgm7n7eYafQ0Y6/vfTwgXPDUGmCoxrOr/WDNDgvjSlVWwK7NPYsXaAUxBUJKlxoqqCkdmjeAPoHVQra5eYAtPgSUBEXRNbDQ==";
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
        cipher.init(Cipher.DECRYPT_MODE,privateKey);
        byte[] bytes = cipher.doFinal(Base64.decode(cipherText));
        System.out.println(new String(bytes));

有需要的自取,网上按照我标题的几个关键字是无法搜到相关信息的,希望我的笔记能帮助到你。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值