KeyFactory factory = KeyFactory.getInstance("RSA");
但是如果我们这样做,当我们使用该工厂对数据进行加密时,服务器会给出不同的输出,客户端也会得到不同的输出。当我们检查提供者时,发现服务器使用的是SunRsaSign,而客户端使用的是OpenSSLRSA。因此,我们尝试在客户端上使用以下设置来使其与服务器一致:
KeyFactory factory = KeyFactory.getInstance("RSA", "SunRsaSign");
但是我们遇到了 java.security.NoSuchProviderException 错误。同样,当我们尝试在服务器上设置OpenSSLRSA时,他们也会遇到相同的错误。
加密的完整代码在服务器和客户端上都是相同的,如下所示:
String pubKey = "<key here>"
byte[] keyData = DatatypeConverter.parseHexBinary(pubKey);
System.out.println("key data" + Arrays.toString(keyData));
KeyFactory factory = KeyFactory.getInstance("RSA");
//System.out.println("provide = " + factory.getProvider());
PublicKey pub = factory.generatePublic(new X509EncodedKeySpec(keyData));
Cipher encryptCipher = Cipher.getInstance("RSA");
encryptCipher.init(Cipher.ENCRYPT_MODE, pub);
byte[] secretMessageBytes = msg.getBytes(StandardCharsets.UTF_8);
System.out.println("secret msg" +Arrays.toString(secretMessageBytes));
byte[] encryptedMessageBytes = encryptCipher.doFinal(secretMessageBytes);
System.out.println("enc data" +Arrays.toString(encryptedMessageBytes));
生成的encryptedMessageBytes不同,这会成为问题吗?我想这是因为不同平台使用了不同的提供程序。
请问有人能帮我设置KeyFactory的提供程序或者如何解决解密错误(javax.crypto.BadPaddingException)吗?
Cipher.getInstance("RSA/ECB/PKCS1Padding")
。可能每一侧的填充默认值不同。 - Topaco