栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Java解密OpenSSL PEM编码的RSA私钥?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Java解密OpenSSL PEM编码的RSA私钥?

您需要使用非标准的OpenSSL方法来获取解密密钥。然后使用它解密PKCS#1编码的密钥-您使用的 不是
PKCS#8信封。您还需要标题中的IV作为这些过程的输入。

看起来像这样:

  static RSAPrivateKey decrypt(String keyDataStr, String ivHex, String password)    throws GeneralSecurityException  {    byte[] pw = password.getBytes(StandardCharsets.UTF_8);    byte[] iv = h2b(ivHex);    SecretKey secret = opensslKDF(pw, iv);    Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");    cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));    byte[] pkcs1 = cipher.doFinal(base64.getMimeDeprer().depre(keyDataStr));        RSAPrivateCrtKeySpec spec = depreRSAPrivatePKCS1(pkcs1);    KeyFactory rsa = KeyFactory.getInstance("RSA");    return (RSAPrivateKey) rsa.generatePrivate(spec);  }  private static SecretKey opensslKDF(byte[] pw, byte[] iv)    throws NoSuchAlgorithmException  {    MessageDigest md5 = MessageDigest.getInstance("MD5");    md5.update(pw);    md5.update(iv);    byte[] d0 = md5.digest();    md5.update(d0);    md5.update(pw);    md5.update(iv);    byte[] d1 = md5.digest();    byte[] key = new byte[24];    System.arraycopy(d0, 0, key, 0, 16);    System.arraycopy(d1, 0, key, 16, 8);    return new SecretKeySpec(key, "DESede");  }  private static byte[] h2b(CharSequence s)  {    int len = s.length();    byte[] b = new byte[len / 2];    for (int src = 0, dst = 0; src < len; ++dst) {      int hi = Character.digit(s.charAt(src++), 16);      int lo = Character.digit(s.charAt(src++), 16);      b[dst] = (byte) (hi << 4 | lo);    }    return b;  }

这已经是很多代码,因此我将链接到该方法定义的另一个答案。

depreRSAPrivatePKCS1()



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/514921.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号