Это шифрование AES достаточно безопасно?

Я получил этот код с http://www.ravenblast.com/index.php/blog/android-password-text-encryption/ и, хотя он работает, у меня растет подозрение, что он недостаточно безопасен. Нет никакого вектора инициализации, который кажется необходимым согласно другим источникам.

public static String encrypt(String toEncrypt, byte[ ] key) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[ ] encryptedBytes = cipher.doFinal(toEncrypt.getBytes());
    String encrypted = Base64.encodeBytes(encryptedBytes);
    return encrypted;
}

public static String decrypt(String encryptedText, byte[ ] key) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] toDecrypt = Base64.decode(encryptedText);
    byte[] encrypted = cipher.doFinal(toDecrypt);
    return new String(encrypted);
}

1 ответ

Решение

Да, это не очень безопасно. Там нет IV, потому что нет цепочки блоков.

Алгоритм AES может шифровать только блоки размером 128 байт независимо от размера ключа (он не связан). Как эти блоки связаны друг с другом - другая проблема. Самый простой подход состоит в том, чтобы зашифровать каждый блок отдельно от других ( режим ECB), как будто они были отдельными сообщениями. В статье Википедии, на которую я ссылаюсь, рассказывается, когда и почему это небезопасно, и другие методы (а именно, режим CBC) предпочтительнее.

Когда вы делаете Cipher cipher = Cipher.getInstance("AES"); Вам предоставляется шифр AES в режиме ECB. Здесь нет непосредственной опасности, но если ваши сообщения имеют повторяющиеся шаблоны, это может привести к ситуациям, подобным следующему:

Оригинал: Зашифрованные: зашифрованная

Другие вопросы по тегам