Я пытаюсь заставить Keystore помочь мне сгенерировать ключ для шифрования AES и использовать его для шифрования обычного текста, который я вставляю. Итак, вот мои коды. Я вызываю метод createKey() только один раз в методе onCreate() другого действия, а затем многократно вызываю метод printCipherText() одним и тем же ключом и тем же открытым текстом. Странная вещь: каждый раз, когда я вызываю метод printCipherText(), я получаю другой результат. Я использую один и тот же ключевой псевдоним и тот же самый открытый текст, но почему каждый раз я получаю разный шифрованный текст?Android AES (с Keystore) производит различные шифрованные тексты с одним и тем же простым текстом
public class KeyCreatorClass {
KeyStore keyStore;
KeyGenerator keyGenerator;
Cipher cipher;
public void createKey(String keyAlias) { //I call this method only once in the onCreate() method of another activity, with keyAlias "A"
try {
keyStore = KeyStore.getInstance("AndroidKeyStore");
keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
keyStore.load(null);
keyGenerator.init(
new KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(false)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.setRandomizedEncryptionRequired(false)
.build());
keyGenerator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
}
public String printCipherText(String keyAlias, String plainText){ //I call this method many times with the same keyAlias "A" and same plaintext in the same activity
try {
keyStore.load(null);
SecretKey key = (SecretKey) keyStore.getKey(keyAlias, null);
cipher.init(Cipher.ENCRYPT_MODE, key);
return byteToHex(cipher.doFinal(plainText.getBytes()));
}catch(Exception e){
e.printStackTrace();
}
return "BUG";
}
private String byteToHex(byte[] byteArray){
StringBuilder buf = new StringBuilder();
for (byte b : byteArray)
buf.append(String.format("%02X", b));
String hexStr = buf.toString();
return hexStr;
}
}
Во всех этих случаях вы получаете исходный текст обратно при расшифровке? – MikeC
Спасибо, я думаю, что @Artjom B. просто решил мою проблему –