【问题标题】:Android KeyStore parameters buildingAndroid KeyStore 参数构建
【发布时间】:2018-11-14 18:21:43
【问题描述】:

我正在尝试将 RSA 加密与 KeyStore 一起使用,我需要为 KeyPairGenerator 指定参数,我在这里迷路了。 KeyPairGeneratorPair 有点简单,但我不明白 KeyGenParameterSpec for API>=23

这就是我所做的,我想我得到了 else 部分的所有内容,但现在我对 KeyGenParameterSpec 感到困惑

RSAKeyGenParameterSpec 中的公共指数究竟是多少?

我应该在.setDigests 中指定哪些摘要?

还有 .setBlockMode() 方法可以调用,因为我使用的是 RSA 和 RSA/None/OAEPWithSHA1AndMGF1Padding要设置哪个块模式?欧洲央行、加拿大央行?

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                generator.initialize(new KeyGenParameterSpec.Builder("PrivateKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                        .setAlgorithmParameterSpec(new RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4))
                        .setDigests(KeyProperties.DIGEST_SHA1,
                                KeyProperties.DIGEST_SHA256)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                        .setCertificateSerialNumber(BigInteger.ONE)
                        .setCertificateSubject(new X500Principal("CN=" + "PrivateKey"))
                        .setCertificateNotBefore(calendar.getTime())
                        .setCertificateNotAfter(endCalendar.getTime())
                        .setKeySize(2048).build());
            } else {
                generator.initialize(new KeyPairGeneratorSpec.Builder(MainActivity.this)
                        .setAlias("PrivateKey")
                        .setSerialNumber(BigInteger.ONE)
                        .setSubject(new X500Principal("CN=" + "PrivateKey"))
                        .setStartDate(calendar.getTime())
                        .setEndDate(endCalendar.getTime())
                        .setKeySize(2048).build()      

 );
            }

Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding");

【问题讨论】:

    标签: android encryption rsa keystore


    【解决方案1】:

    方法 setDigests() 为您的填充模式设置摘要方法,setBlockMode() 设置取决于您的工作的加密模式。

    我认为你设置了很多不必要的字段。比如我用这个方法创建自己的RSA键:

    public boolean createKey() {
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_RSA,
                    "AndroidKeyStore"
            );
    
            mKeyStore.load(null);
            KeyGenParameterSpec.Builder builder =
                    new KeyGenParameterSpec.Builder(
                            MY_KEY,
                            KeyProperties.PURPOSE_DECRYPT).
                    setKeySize(MY_KEYLEN).
                    setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP).
                    setDigests(KeyProperties.DIGEST_SHA256);
    
            keyPairGenerator.initialize(builder.build());
            keyPairGenerator.generateKeyPair();
        } catch (NoSuchAlgorithmException | CertificateException | IOException |
                InvalidAlgorithmParameterException | NoSuchProviderException e) {
            return false;
        }
    
        return true;
    }
    

    我创建了这个密钥以用于RSA/ECB/OAEPWithSHA-256AndMGF1Padding 算法。

    【讨论】:

    • 哦,所以我根本不需要指定这些字段。还有一件事,我怎么知道要使用哪个摘要?喜欢 SHA256 还是 SHA512?如果我使用OAEPWithSHA1 是否意味着我应该使用SHA1
    • @Wiktor 取决于您要使用的密码。例如,我创建了此密钥以在 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 中使用。这个算法需要SHA-256摘要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多