Я использую приведенный ниже класс для генерации ключа AES 256, вектора инициализации, шифрования и дешифрования в android. Есть несколько проблем, с которыми я сталкиваюсь
1) Когда я вызываю getInitializationVector (), он возвращает 24 символа вместо 16. (Например: WoiUFsQpizjG705OXja1Jw == )
2) Когда Я вызываю generateKey (), он возвращает 44 символа вместо 32. (например: tEf + dcrzI4x + kSMS8UZxjwziGySMMkDxO0aVgsj0oBs = )
3) Приведенный ниже класс - симметричный c подход, как сделать его асимметричным c.
Вы можете видеть textKey и testIV для значений по умолчанию. Но я не могу его создать. Я искал в переполнении стека решения, но все возвращают мне текст одинаковой длины. Кто-нибудь знает как это сделать? Я делаю не так? Спасибо за ваше драгоценное время заранее.
public class CryptoDataHandler {
//32 characters
String testKey = "82a645babc5cd41c9a2cb4d0d3ba17ad";
//16 characters
String testIV = "acf30ad32b693849";
String edType = "AES";
String chiperInstanceType = "AES/CBC/PKCS5PADDING";
private static CryptoDataHandler instance = null;
public static CryptoDataHandler getInstance() {
if (instance == null) {
Security.setProperty("crypto.policy", "unlimited");
instance = new CryptoDataHandler();
}
return instance;
}
public String encrypt(String message) throws NoSuchAlgorithmException,
NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException, InvalidKeyException,
UnsupportedEncodingException, InvalidAlgorithmParameterException {
byte[] srcBuff = message.getBytes(StandardCharsets.UTF_8);
//here using substring because AES takes only 16 or 24 or 32 byte of key
SecretKeySpec skeySpec = new
SecretKeySpec(testKey.substring(0, 32).getBytes(), edType);
IvParameterSpec ivSpec = new
IvParameterSpec(testIV.substring(0, 16).getBytes());
Cipher ecipher = Cipher.getInstance(chiperInstanceType);
ecipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
byte[] dstBuff = ecipher.doFinal(srcBuff);
return Base64.encodeToString(dstBuff, Base64.DEFAULT);
}
public String decrypt(String encrypted) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, UnsupportedEncodingException {
SecretKeySpec skeySpec = new
SecretKeySpec(testKey.substring(0, 32).getBytes(), edType);
IvParameterSpec ivSpec = new
IvParameterSpec(testIV.substring(0, 16).getBytes());
Cipher ecipher = Cipher.getInstance(chiperInstanceType);
ecipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
byte[] raw = Base64.decode(encrypted, Base64.DEFAULT);
byte[] originalBytes = ecipher.doFinal(raw);
return new String(originalBytes, StandardCharsets.UTF_8);
}
public String generateKey() {
try {
Key key;
SecureRandom rand = new SecureRandom();
KeyGenerator generator = KeyGenerator.getInstance(edType);
generator.init(256, rand);
key = generator.generateKey();
return Base64.encodeToString(key.getEncoded(), Base64.DEFAULT);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public String getInitializationVector() {
byte[] IV = new byte[16];
SecureRandom random = new SecureRandom();
random.nextBytes(IV);
return Base64.encodeToString(IV, Base64.DEFAULT);
}
}