Java RSA шифрование - PullRequest
       13

Java RSA шифрование

10 голосов
/ 21 мая 2011

Я пытаюсь закодировать простой «тест» строк и обратно.

public static String encode(Key publicKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    byte[] byteData = data.getBytes(); // convert string to byte array

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); // initialize object's mode and key

    byte[] encryptedByteData = cipher.doFinal(byteData); // use object for encryption

    return new String(encryptedByteData); // convert encrypted byte array to string and return it

}

public static String decode(Key privateKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    byte[] byteData = data.getBytes(); // convert string to byte array

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object
    cipher.init(Cipher.DECRYPT_MODE, privateKey); // initialize object's mode and key

    System.out.println(byteData.length);

    byte[] decryptedByteData = cipher.doFinal(byteData); // use object for decryption

    return new String(decryptedByteData); // convert decrypted byte array to string and return it

}

Однако, хотя шифрование работает просто отлично (ALGORITHM - «RSA»), при попытке расшифровать строку Iтолько что получил от шифрования «тест», я получаю следующее исключение:

javax.crypto.IllegalBlockSizeException: данные не должны быть длиннее 256 байтов

Если я разделитьзашифрованные байты кусками по 256, чтобы можно было его расшифровать?

Ответы [ 3 ]

9 голосов
/ 21 мая 2011

Вы не можете надежно преобразовать случайные байты в String. Результаты будут зависеть от того, какая кодировка символов по умолчанию используется на компьютере, на котором вы ее запускаете. При многих кодировках текст шифра будет поврежден, а информация будет потеряна.

Измените ваш код, чтобы вместо него использовать byte[] (результат метода doFinal () `.

Если вам нужно преобразовать byte[] в строку символов, используйте кодировку, например Base-64.

4 голосов
/ 21 мая 2011

С здесь :

Алгоритм RSA может шифровать только те данные, которые имеют максимальную длину в байтах. длины ключа RSA в битах, разделенных на восемь минус одиннадцать байтов, то есть число максимальных байтов = длина ключа в битах / 8 - 11. Если вы хотите зашифровать большие данные, то используйте больший ключ, например, ключ с 4096 битами позволит вам зашифровать 501 байт данных.

3 голосов
/ 21 мая 2011

Если у вас длинные данные, вы должны либо разделить их на порции данных, которые подходят и зашифровать / расшифровать каждый из них (не очень хорошая идея), либо зашифровать / расшифровать их с помощью симметричного алгоритма (AES / DES / RC4 / и т. д.), зашифруйте симметричный ключ открытым ключом RSA и отправьте оба на другую сторону. (гораздо лучшая идея).

Второй подход является очень распространенным, поскольку алгоритмы асимметричного шифрования намного дороже, чем симметричные алгоритмы (как для шифрования, так и для дешифрования).

...