PKCS8私钥转PKCS1私钥

PKCS8私钥转PKCS1私钥

简介

企业微信获取到的加密内容为企业微信产生。RSA使用PKCS1,而不是PKCS8,但是填充的公钥要求是PKCS8,这是企业微信巨坑的地方。找到此问题后,就需要单独转换私钥key了。废话不多说,以下是代码,仅做记录,供同行人少走弯路。

jar坐标

 compile group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.69'
 compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.69'
 compile 'org.bouncycastle:bcpg-jdk16:1.46'

代码

 /**
     * PKCS8私钥key,转换为PKCS1私钥key
     * @param privateKey PKCS8 RSA私钥(即-----BEGIN PRIVATE KEY-----开头)
     * @return
     * @throws Exception
     */
    public static PrivateKey getPrivateKey(String privateKey) throws Exception {
      //PKCS8格式转换为PKCS1格式
        String privKeyPEMNew = privateKey.replaceAll("\\n", "")
                .replace("-----BEGIN PRIVATE KEY-----", "")
                .replace("-----END PRIVATE KEY-----", "")
                .replaceAll(" ", "");
        byte[] e = org.apache.tomcat.util.codec.binary.Base64.decodeBase64(privKeyPEMNew);   //base64无法解析换行符,-等特殊符号
        PrivateKeyInfo pki = PrivateKeyInfo.getInstance(e);
        RSAPrivateKey pkcs1Key = RSAPrivateKey.getInstance(pki.parsePrivateKey());
        RSAPrivateKeySpec rsaPrivateKeySpec = new RSAPrivateKeySpec(pkcs1Key.getModulus(),pkcs1Key.getPrivateExponent());
        // 实例化KeyFactory对象,并指定 RSA 算法
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        // 获得 PrivateKey 对象
        PrivateKey realprivateKey = keyFactory.generatePrivate(rsaPrivateKeySpec);
        return realprivateKey;


    }
        /**
         * 通过PKCS8私钥key解密RSA PKCS1
         */
        public static String encryptByPrivateKey(String content, String privateKey) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
        rsa.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));
        byte[] utf8 = rsa.doFinal(org.apache.tomcat.util.codec.binary.Base64.decodeBase64(content));
        String result = new String(utf8, "UTF-8");
        return result;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值