IBM sdk 的 SunRSASign 提供程序

SunRSASign Provider for IBM sdk

我正尝试在 Oracle 1.7 和 IBM 1.7 上 运行 以下代码 JDK。

KeyPairGenerator serverKpairGen = KeyPairGenerator.getInstance("RSA");
        serverKpairGen.initialize(2048,new SecureRandom());
        KeyPair serverKpair = serverKpairGen.generateKeyPair();


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(baos);

          oos.writeObject(serverKpair);
          oos.close();
          baos.close();

          byte[] serializedObject = baos.toByteArray();
          System.out.println(Base64.encode(serializedObject, false, false).length());

Oracle 默认使用 SunRsaSign 作为 RSA 算法的默认提供者,而 IBM 使用 IBMJCE

IBMJCE 给出长度为 5100 字节的密钥对,而 Oracle 生成的密钥对长度接近 2800 字节。

我尝试将SunJce设置为提供者,但它不支持RSA算法。

IBM SDK 1.6 或 1.7 中是否有将 SunRSASign 设置为提供者的功能?我观察到 SunRSASign 是 Oracle java 中 rt.jar 的一部分。 我们能否将 IBM java 中的 ServerKey 对大小减少到 < 4000 字节?

我们可以在 IBM sdk 中获得类似于 Oracle jdk 的密钥大小长度吗? IBM 中是否有任何其他默认提供程序使用 RSA2048 提供更小的密钥大小。

James 已经在评论中给出了大部分答案:使用 PKCS#12 密钥库作为私钥。这比不受保护地存储它更安全。

您可以使用 getEncoded 获取 public / 私钥的编码。此编码已经包含一个长度,但您可能希望在它之前使用 4 字节长度编码 - 编码整数 - none-the-less。所以你的序列化需要两个步骤。

对于 Java 的 SunRSASign 它 returns public 密钥的 SubjectKeyIdentifier 和私钥的内部 PKCS#8 结构。尽管 getEncoded 没有标准化(在我看来这是一个很大的错误,但没关系)大多数其他供应商无论如何都会效仿 Sun / Oracle 的做法。

无论供应商采取何种方式getEncoded

  1. 两种结构都定义明确且标准化,并且
  2. 它们比提供商特定的对象序列化更容易解析;
  3. 最后,它们也将比您当前处理的结构小得多。

您可以使用 getInstance("RSA") 创建的 KeyFactory 来取回密钥。密钥规范应使用 X509EncodedKeySpec 作为 SubjectPublicKey 并使用 PKCS8EncodedKeySpec 作为 PKCS#8 编码私钥。