Я понимаю, что шифрование AES должно быть в блоках по 16, но у меня создалось впечатление, что с помощью Cipher.getInstance("AES/ECB/PKCS5PADDING");
для заполнения этого байта использовался массив байтов. Мой код ниже:IllegalBlockSizeException при использовании aes/ecb/pkcs5padding для расшифровки массива байтов
CipherUtils.java
private static byte[] key = {
0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79
};//"thisIsASecretKey";
public static byte[] EncryptByteArray(byte[] array)
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return (cipher.doFinal(array));
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
public static byte[] DecryptByteArray(byte[] array)
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(array);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
Основная программа
fis = new FileInputStream(path);
toDecrypt = new byte[fis.available()+1];
int content;
int i = 0;
while ((content = fis.read()) != -1) {
// convert to byte and display it
toDecrypt[i] = (byte)content;
i += 1;
}
byte[] decryptedStr = CipherUtils.DecryptByteArray(toDecrypt);
FileOutputStream decryptedStream = new FileOutputStream(path);
decryptedStream.write (decryptedStr);
decryptedStream.close();
Файл в path
был зашифрован с помощью функции в cipherutils.java и записываются в файл с использованием FileOutputStream.write
U pdate- Я создаю для Android с помощью Gradle.
Начните с модульного тестирования ваших методов с помощью жестко закодированного ввода: шифрование и дешифрование результата должны привести к выходу, равному входу. После этого вы поймете, что шифрование и дешифрование работают нормально, и проблема в том, как вы пишете и читаете ваши файлы. Функция available() не возвращает длину файла. И даже если бы это было так, в массиве содержится дополнительный байт. Так что это не имеет смысла. –
Пожалуйста, не используйте режим ECB. Это не семантически безопасно. Вы должны использовать по крайней мере режим CBC со случайным IV. В лучшем случае вы должны аутентифицировать зашифрованные тексты. Обычно это делается либо с использованием аутентифицированного режима, как GCM, либо с запуском зашифрованного текста через HMAC (encrypt-then-MAC). –
... или работает * IV * и зашифрованный текст, хотя HMAC ... –