Подтвердить что ты не робот

Неверная ошибка длины ключа AES

этот код дает неверную ошибку длины ключа 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);
}
}

любая помощь оценена

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Для практических деталей реализации см.

Ответ 3

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

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

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

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

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

Ответ 4

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