неверная ошибка длины ключа AES - PullRequest
25 голосов
/ 19 ноября 2009

этот код дает неверную ошибку длины ключа AES. как я могу это исправить? (я хочу 128-битное шифрование AES ключа)

package org.temp2.cod1;
import java.security.*;

import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;

public class Code1 {

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    String s = "9882623867";
    byte[] plaintext = s.getBytes("UTF-16");
    String s2 = "supernova";
    byte[] key = s2.getBytes("UTF-16");
    Cipher c = Cipher.getInstance("AES");
    SecretKeySpec k =  new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    byte[] encryptedData = c.doFinal(plaintext);
    System.out.println(encryptedData);
}
}

любая помощь приветствуется

Ответы [ 4 ]

22 голосов
/ 19 ноября 2009

Используйте SecretKeyFactory для получения байтов ключа из пароля. Вы можете увидеть подробный пример здесь. Обратите внимание, что вам нужно указать длину ключа 128 бит, а не 256 бит как показано в этом примере.

Следующая проблема, с которой вы столкнетесь, заключается в том, что вы не указали схему заполнения. Если ваши сообщения не кратны 16 байтам (размер блока AES), это вызовет ошибку. Используйте PKCS5Padding, как показано в примере.

Использование режима CBC на шифре потребует выбора нового вектора инициализации для каждого сообщения. Этот уникальный IV должен быть отправлен получателю вместе с зашифрованным сообщением.

Попытка выполнить криптографию без глубокого понимания поднятых здесь концепций (и многих других) может привести к небезопасной системе.

10 голосов
/ 19 ноября 2009

Обычно вы не можете использовать произвольную длину ключа (например, что вы делаете здесь со «сверхновой») для блочного шифра, такого как AES. Вы должны использовать поддерживаемую длину ключа (128, 192, 256 и т. Д.), Соответствующую вашему алгоритму выбора.

Одним из распространенных способов сделать это является хеширование вашей парольной фразы (например, через SHA) и извлечение первых N байтов. В любом случае это лучше, так как позволяет вам «засолить» свой пароль значением инициализации, так что никакие «ключи» двух пользователей не будут идентичны, даже если их парольные фразы совпадают. Если вы действительно заинтересованы в этом материале, оригинальная работа - Прикладная криптография Брюса Шнайера .

Подробнее о практической реализации: см.

1 голос
/ 15 сентября 2014

Вы можете получить эту ошибку, когда ключ, который вы пытаетесь использовать, имеет неправильную длину.

Итак, в psuedocode вы пытаетесь что-то вроде этого:

String key = "123";
SecretKeySpec k =  new SecretKeySpec(key, "AES");

но ключ слишком короткий - это должно быть что-то вроде, скажем, 31 символа.

Итак, проверьте значение ключа -> оно, вероятно, где-то неправильно хранится.

0 голосов
/ 27 июня 2016

Используйте строку значения ключа с 16 байтами для плавного шифрования, например, Ключ "thebestsecretkey" будет работать на base64

...