2015-04-07 2 views
1

Исключения поймано на линиикак решить javax.crypto. IllegalBlockSizeException без увеличения размера, если ключ

encryptedData = cipher.doFinal(data); 

javax.crypto.IllegalBlockSizeException: Data must not be longer than 501 bytes 
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344) 

размера ключа определяется по формуле: keyPairGenerator.initialize(4096);

Как решить эту проблему без увеличения размера ключа?

ответ

2

С помощью асимметричного шифрования невозможно зашифровать данные дольше, чем ключевые минусовые отступы. Поскольку для вас 11 байт, я могу заключить, что вы используете дополнение PKCS # 1. То, что вы можете сделать, это попытаться сжать данные, но в зависимости от длины и характера данных он легко может выйти из строя. Другим вариантом является сочетание симметричных блочных шифров (который не имеет никаких ограничений на размер данных) и асимметричное шифрование:

  1. генерации случайных ключа AES

    byte[] keyData = new byte[32]; 
    SecureRandom random = new SecureRandom(); 
    random.nextBytes(keyData); 
    
  2. Шифрование данных с AES.

    // zero filled input vector 
    byte[] ivData = new byte[32]; 
    IvParameterSpec iv = new IvParameterSpec(ivData); 
    SecretKeySpec keySpec = new SecretKeySpec(keyData, "AES"); 
    Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    aes.init(Cipher.ENCRYPT_MODE, keySpec, iv); 
    byte[] cipherText = aes.doFinal(data); 
    
  3. ключ Шифрование AES (для AES-256 это 32 байт) с RSA ключа.

    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.WRAP_MODE, rsaKeyPair.getPublic()); 
    byte[] wrappedKey = cipher.doFinal(keyData); 
    
  4. Объединенный обернутыйКлючевой текст с шифровым текстом. Может быть сделано только с добавлением одного к другому, но также может использоваться некоторый двоичный формат.

Смежные вопросы