大约一年前,我为Android编写了一个应用程序,并在其中使用了一个类RSA在这个类中,有以下代码片段,应用程序工作正常
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
但是当我重新输入应用程序代码时,我没有打开新的加密信息来更改私钥,直到我将上面的代码行更改为下面的代码行。
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
问题是,如果我在RSA类中替换上面的代码片段,就不可能再打开以前加密的信息(使用与以前相同的密钥)。我看到了下面的错误
javax.crypto.BadPaddingException: error:04000084:RSA routines:OPENSSL_internal:PKCS_DECODING_ERROR
RSA解密
public static byte[] decryptByPrivateKey(byte[] data, String key)
throws Exception {
byte[] keyBytes = decryptBASE64(key);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
// Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
发布于 2021-06-23 16:42:36
RSA密钥对可以在不同的基于RSA的方案中使用,例如用于加密的PKCS#1和OAEP填充,以及用于签名的PKCS#1和PSS填充。但是,只有一种可能的密钥对生成,简单地表示为"RSA"
。
如果只使用"RSA"
作为输入字符串,它将使用为特定加密提供程序设置的默认值,在本例中,该提供程序是第一个使用软件中的密钥实现RSA.显然,在Android上这与PKCS#1填充有所不同(当然,假设你仍然使用原始的提供商列表)。Java语言中的一个愚蠢之处在于,您无法通过编程方式找出使用了哪些默认值;getAlgorithm()
通常只返回您先前提供的字符串。您唯一能做的就是使用getProvider()
获取提供者,然后查找默认值……
我永远不会使用任何缺省值(除了SecureRandom
缺省值),因为没有指定哪个缺省值将用于Java。始终完整地指定算法;前面的字符串没有问题。
https://stackoverflow.com/questions/68093610
复制相似问题