Построение параметров Android KeyStore - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь использовать шифрование RSA с KeyStore, и мне нужно указать параметры для KeyPairGenerator, и я здесь потерян. KeyPairGeneratorPair довольно просто, но я не понимаю KeyGenParameterSpec для API> = 23

Это то, что я сделал, я думаю, что все понял в else части, но теперь я запутался в KeyGenParameterSpec

Что такое публичный показатель в RSAKeyGenParameterSpec?

Какие дайджесты в .setDigests я должен указать?

Также есть метод .setBlockMode() для вызова, и, поскольку я использую RSA и RSA/None/OAEPWithSHA1AndMGF1Padding, какой режим блока установить? ЕЦБ, CBC?

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

1 Ответ

0 голосов
/ 14 ноября 2018

Метод 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.

...