Есть ключик 256 бит, который генерится KeyGenerator таким способом:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
key = keyGen.generateKey();
Я хочу его положить в KeyStore, в результате я генерю его так:
KeyGenerator keyGen2 = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEYSTORE_TYPE);
keyGen2.init(new KeyGenParameterSpec.Builder(ALIAS_ANY, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setKeySize(256)
.build());
this.key = keyGen2.generateKey();
В результате encrypt/decrypt уменьшает эффективность в разы. Без BLOCK_MODE_GCM метод крашится в процессе, так же как и без ENCRYPTION_PADDING_NONE.
Чем отличается ключ по умолчанию от моей записи для KeyStore?
Потому что когда вы пишете в строке трансформации просто "AES", например:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
По умолчанию выбирается метод трансформации AES/ECB/PKCS5Padding - что конечно же намного быстрее чем метод сцепления блоков GCM
Вообще обычно принято выбирать:
AES/CBC/PKCS7Padding
что является более-менее промышленным стандартом.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей