Java: пакет шифрования (шифрование и дешифрование).ошибка неверного ключа - PullRequest
2 голосов
/ 07 мая 2010

Я делаю класс со статическими методами для шифрования и дешифрования сообщения с использованием javax.crypto. У меня есть 2 статических метода, которые используют ecipher и dcipher для того, чтобы сделать то, что им нужно, мне нужно инициализировать некоторые переменные (которые также являются статическими). Но когда я пытаюсь использовать его, я получаю InvalidKeyException с параметрами, которые я даю ecipher.init (...). Я не могу найти почему. Вот код:

    private static byte[] raw = {-31,   17,   7,  -34,  59, -61, -60,  -16, 
                              26,   87, -35,  114,   0, -53,  99, -116, 
                             -82, -122,  68,   47,  -3, -17, -21,  -82, 
                             -50,  126, 119, -106, -119, -5, 109,   98};
    private static SecretKeySpec skeySpec;
    private static Cipher ecipher;
    private static Cipher dcipher;

    static {
        try {
            skeySpec = new SecretKeySpec(raw, "AES");
            // Instantiate the cipher
            ecipher = Cipher.getInstance("AES");
            dcipher = Cipher.getInstance("AES");
            ecipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            dcipher.init(Cipher.DECRYPT_MODE, skeySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new UnhandledException("No existe el algoritmo deseado", e);
        } catch (NoSuchPaddingException e) {
            throw new UnhandledException("No existe el padding deseado", e);
        } catch (InvalidKeyException e) {
            throw new UnhandledException("Clave invalida", e);
        }
    }

Ответы [ 2 ]

4 голосов
/ 07 мая 2010

AES-256 (и AES-192) требует, чтобы для JRE были установлены файлы политики неограниченной юрисдикции (один для последних загрузок в http://java.sun.com/javase/downloads/index.jsp). Отсутствие этой поддержки приведет к исключению InvalidKeyException при попытке использовать 192 или 256-битные ключи, как в вашем классе.

Максимально допустимый размер ключа для AES без неограниченной силы задокументирован в Справочном руководстве JCA для Java 6 , и в этом случае он составляет 128 бит.

1 голос
/ 07 мая 2010

Из документа SecretKeySpec:

Этот конструктор не проверяет, данные байты действительно указывают секрет ключ указанного алгоритма. За Например, если алгоритм DES, это конструктор не проверяет, является ли ключ 8 байт долго, а также не проверяет для слабых или полуслабых ключей. С целью для тех проверок, которые будут выполнены, спецификация алгоритма класс (в данном случае: DESKeySpec) следует использовать.

Полагаю, ваши байты не соответствуют действительному ключу для AES. Здесь вы можете найти пример того, как его сгенерировать. Суерте.

ОБНОВЛЕНИЕ: см. Также здесь .

ОБНОВЛЕНИЕ 2: Как указывает другой ответ, ваш конкретный raw, безусловно, является недействительным, поскольку ваша система не поддерживает AES 256. Сократите его до 16 байтов (128 бит) и повторите попытку.

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