Android AES и вектор инициализации - PullRequest
4 голосов
/ 18 марта 2011

У меня проблема с шифрованием и дешифрованием AES: я могу полностью изменить свой IV, и все же я могу декодировать свои данные.

public static final byte[] IV = { 65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 };
public static final byte[] IV2 = { 65, 1, 2, 23, 45, 54, 61, 81, 32, 21, 10, 121, 12, 13, 84, 45 };
public static final byte[] KEY = { 0, 42, 2, 54, 4, 45, 6, 7, 65, 9, 54, 11, 12, 13, 60, 15 };
public static final byte[] KEY2 = { 0, 42, 2, 54, 43, 45, 16, 17, 65, 9, 54, 11, 12, 13, 60, 15 };
//public static final int BITS = 256;

public static void test()
{
    try
    {
        // encryption
        Cipher c = Cipher.getInstance("AES");
        SecretKeySpec keySpec = new SecretKeySpec(KEY, "AES");
        c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(IV));

        String s = "Secret message";
        byte[] data = s.getBytes();

        byte[] encrypted = c.doFinal(data);

        String encryptedStr = "";
        for (int i = 0; i < encrypted.length; i++)
            encryptedStr += (char) encrypted[i];


        //decryoption
        Cipher d_c = Cipher.getInstance("AES");
        SecretKeySpec d_keySpec = new SecretKeySpec(KEY, "AES");
        d_c.init(Cipher.DECRYPT_MODE, d_keySpec, new IvParameterSpec(IV2));

        byte[] decrypted = d_c.doFinal(encrypted);
        String decryptedStr = "";
        for (int i = 0; i < decrypted.length; i++)
            decryptedStr += (char) decrypted[i];
        Log.d("", decryptedStr);

    }
    catch (Exception ex)
    {
        Log.d("", ex.getMessage());
    }
}

Есть идеи, что я делаю неправильно?Как я могу получить 256-битное AES-шифрование (изменить ключ только на 32-байтовый массив?)

Шифрование - это новая тема для меня, поэтому, пожалуйста, ответьте новичкам.

1 Ответ

9 голосов
/ 18 марта 2011

Вы не указываете режим шифрования, поэтому поставщик, вероятно, по умолчанию использует режим Электронной кодовой книги («ECB») и полностью игнорирует IV.Вы можете убедиться в этом, сравнив зашифрованный текст, созданный несколькими прогонами вашей программы;Я предполагаю, что все они идентичны.

Цепочка блоков шифра ("CBC") обычно поддерживается и широко используется, но правильный режим зависит от вашего приложения.

Вы не 'Также не нужно указывать отступы, поэтому провайдер выбирает значение по умолчанию.То, что JCE называет «PKCS5Padding», является общим выбором для симметричных шифров.

Вместо указания «AES» в качестве алгоритма, предоставьте полную спецификацию, включая алгоритм, режим и заполнение, например «AES / CBC / PKCS5Padding".

Вам не нужно указывать размер ключа AES в имени Cipher;это определяется размером ключа, который вы используете для инициализации шифра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...