Проблема расшифровки открытого личного ключа Java

Я пытаюсь зашифровать и расшифровать сообщение, как указано в приведенном ниже коде. По сути, я хочу зашифровать сообщение с помощью открытого ключа и преобразовать это зашифрованное сообщение из байтового массива в строку. И расшифровать эту строку в исходный текст. Вот оба метода. Здесь шифрование работает нормально, но дешифрование не удается (ошибка "Данные должны начинаться с нуля"). Я думаю, что это вызывает, потому что я конвертирую зашифрованный байтовый массив в строку.

Как мне это решить? (Я хочу иметь зашифрованный массив байтов в виде строки и использовать его для расшифровки) Есть ли другой подход (с открытым и закрытым ключами)

public static String getEncryptedMessage(String publicKeyFilePath,

    String plainMessage) {
    byte[] encryptedBytes;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        byte[] publicKeyContentsAsByteArray = getBytesFromFile(publicKeyFilePath);
        PublicKey publicKey = getPublicKey(publicKeyContentsAsByteArray);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(plainMessage.getBytes());
        return new String(encryptedBytes);
    } catch (Throwable t) {

    }

}
public static String getDecryptedMessage(
        String privateKeyFilePath, String encryptedMessage)
         {
    byte[] decryptedMessage;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        byte[] privateKeyContentsAsByteArray = getBytesFromFile(privateKeyFilePath);
        PrivateKey privateKey = getPrivateKey(privateKeyContentsAsByteArray);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        decryptedMessage = cipher.doFinal(encryptedMessage.getBytes());
        return new String(decryptedMessage);
    } catch (Throwable t) {


}

3 ответа

Решение

Если вы посмотрите на эту страницу ( http://www.wikijava.org/wiki/Secret_Key_Cryptography_Tutorial), вам нужно будет выполнить кодирование base-64, чтобы превратить байты в строку, затем для расшифровки вы просто расшифруете, а затем расшифруете.

Кодирование Base-64 использует первые 7 бит байта, например, для создания чего-либо, что можно распечатать или отправить по электронной почте.

ОБНОВИТЬ:

Я сделал ошибку, есть 64 символа, в которые он был бы закодирован, опять же, чтобы сделать его более удобным для печати.

Почему вы не рассматриваете сообщение как байтовый массив от шифрования до дешифрования? Зачем менять его на строку в середине? (Я знаю, что это похоже на вопрос, но на самом деле это ответ...)

Использование RSA непосредственно для неформатированных данных может сделать ваше приложение уязвимым для атаки с использованием адаптивного выбранного шифротекста. Подробности см. В главе 8, стр. 288-289, " Руководства по прикладной криптографии", свободно доступной книги CRC Press. (Если вы действительно интересуетесь криптографией, то стоит купить переплетенное издание - вы будете поражены качеством за такую ​​цену.)

Из-за этой атаки большинство протоколов, которые интегрируют RSA, используют RSA для шифрования случайно сгенерированных сеансовых ключей или подписания хеш-функций с выходными данными, которые должны быть неотличимы от случайных, ИЛИ с использованием очень тщательно отформатированных сообщений, которые не будут правильно интерпретироваться. (Подробнее см. Примечание 8.63 в HAC.)

Другие вопросы по тегам