RSA-шифрование и дешифрование длинного сообщения в Java - PullRequest
2 голосов
/ 05 августа 2011

Я хочу использовать стандартную библиотеку Java, и, насколько я знаю, ее функции ограничены. Поэтому я реализовал два метода для этой цели. Вот они:

private byte[] RSAenc(String in) throws Exception {
    Cipher c = Cipher.getInstance("RSA");
    c.init(Cipher.ENCRYPT_MODE, privKey);
    int l = in.length();

    byte[] part;
    byte[] result = new byte[(int)(64*java.lang.Math.ceil(l/20.0))];
    int i = 0;
    while(i*20+20<l) {
        part = c.doFinal(in.substring(i*20,i*20+19).getBytes("UTF-8"));
        System.arraycopy(part, 0, result, i*64, part.length);
        i = i+1;
    }
    part = c.doFinal(in.substring(i*20,l-1).getBytes("UTF-8"));
    System.arraycopy(part, 0, result, i*64, part.length);
    return result;

}

private String RSAdec(byte [] in) throws Exception {
    Cipher c = Cipher.getInstance("RSA");
    c.init(Cipher.DECRYPT_MODE, privKey);

    String result = "";
    byte[] part = new byte[64];
    int l = in.length;
    int i = 0;
    while(i+64<=l) {
        System.arraycopy(in, i, part, 0, part.length);
        result = result + new String(c.doFinal(part), "UTF-8");
        i= i+64;
    }
    return result;
}

Они работают следующим образом: для шифрования я разбиваю строку максимум на 20 подстрок размера, а затем использую шифр для их шифрования. Для дешифрования я разбиваю байтовый массив на 64 байтовых блока и применяю к ним дешифрование шифра. Уже есть функция, которая делает это? Или, по крайней мере, есть более точное решение? Насколько безопасен мой подход? Всегда ли длина результата шифрования (result.length) равна 64 во всех дистрибутивах JRE?

Thanx,

1 Ответ

6 голосов
/ 05 августа 2011

RSA подходит для шифрования ключей, а не для массового шифрования данных.

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

...