【问题标题】:how to use (RSA/ECB/PKCS1Padding) in android如何在安卓中使用(RSA/ECB/PKCS1Padding)
【发布时间】:2021-09-06 15:23:39
【问题描述】:

大约一年前,我为Android写了一个应用程序,并在其中使用了一个类 RSA 在这个类中,有以下代码sn -p并且应用程序工作

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")

但是当我重新输入应用程序代码时,我没有打开新的加密信息来更改私钥,直到我将上面的代码行更改为下面的代码行。

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

问题是,如果我在 RSA 类中替换上面的代码 sn-p,则不再可能打开以前加密的信息(使用与以前相同的密钥)。 我看到以下错误

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);
    }

【问题讨论】:

  • 你有没有试过调试=打印出keyFactory.getAlgorithm给出的值?在我的机器上它是“RSA”,这与“RSA/ECB/PKCS1Padding”的算法不同。始终对您正在使用的算法使用完整的限定符。
  • 您的问题标题应该修改,因为keyFactory.getAlgorithm() 似乎没有实现 PKCS#1 填充,这就是您遇到的问题。

标签: java android encryption rsa


【解决方案1】:

RSA 密钥对可以在不同的基于 RSA 的方案中使用,例如用于加密的 PKCS#1 和 OAEP 填充,以及用于签名的 PKCS#1 和 PSS 填充。但是,只能生成一个密钥对,简称为"RSA"

如果只使用"RSA" 作为输入字符串,它将使用为特定加密提供程序设置的默认值,在这种情况下,它是第一个使用软件中的密钥实现 RSA 的提供程序。显然,这在 Android 上与 PKCS#1 填充不同(当然,假设您仍然使用原始提供者列表)。 Java 中的一件愚蠢的事情是您无法以编程方式找出 使用了哪些默认值getAlgorithm() 通常只返回您之前提供的字符串。您唯一能做的就是使用getProvider() 获取提供程序,然后查找默认值...

我永远不会选择任何默认值(SecureRandom 默认值除外),因为未指定哪些默认值将用于 Java。始终完整指定算法;你之前的字符串很好。

【讨论】:

  • 您可以编辑问题中System.out.println(getProvider()) 的结果以及您的运行时环境 - Android API 级别等,希望有人知道或可以找出默认值...
  • Swift 是否有同样的问题,应该指定提供者而不是默认提供者?
  • 似乎并非如此,因为 Apple API 要求每个 explicit identifiers。在粉丝大喊“胜利”之前:这是 Apple,所以他们并没有真正指定什么协议,例如rsaEncryptionOAEPSHA1AESGCM 紧随其后,因此他们的 API 不是通用加密库的好例子。这基本上意味着它们仅与 Apple 兼容(天哪)......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2013-09-30
  • 1970-01-01
  • 2013-03-12
  • 2022-12-22
  • 1970-01-01
相关资源
最近更新 更多