Проблема расшифровки открытого личного ключа Java - PullRequest
3 голосов
/ 19 марта 2011

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

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

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 ]

2 голосов
/ 19 марта 2011

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

2 голосов
/ 19 марта 2011

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

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

2 голосов
/ 19 марта 2011

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

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

UPDATE:

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

...