Java-код RSA не работает для ввода текста большего размера?

Я нашел этот код rsa в сети. У меня проблема с кодом, он не работает должным образом для большого текста. Однако он отлично расшифровывает текст из нескольких строк. Может ли кто-нибудь указать на ошибку в коде или логике, пожалуйста. Спасибо

import java.math.BigInteger;  
import java.util.Random; 
import java.io.*; 
/**
*
* @author Mohtashim
*/
public class RSA {  

    private BigInteger p;  
    private BigInteger q;  
    private BigInteger N;  
    private BigInteger phi;  
    private BigInteger e;  
    private BigInteger d;  
    private int bitlength = 1024;  
    private int blocksize = 128; //blocksize in byte  

    private Random r;  
    public RSA() {  
        r = new Random();  
        p = BigInteger.probablePrime(bitlength, r);  
        q = BigInteger.probablePrime(bitlength, r); 

        long startTime= System.nanoTime();
        N = p.multiply(q);  
        phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));  
        long endTime= System.nanoTime();
        System.out.println((endTime-startTime)/1000);
        e = BigInteger.probablePrime(bitlength/2, r);  

        while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0 ) {  
            e.add(BigInteger.ONE);  
        }     
        d = e.modInverse(phi);   

        System.out.println("p    : " + p);
        System.out.println("q    : " + q);
        System.out.println("phiN : " + N);
        //System.out.println("gcd  : " + gcd);
        System.out.println("e  : " + e);
        System.out.println("d    : " + d);   
    } 
    private static String bytesToString(byte[] encrypted) {  
        String test = "";  
        for (byte b : encrypted) {  
            test += Byte.toString(b);  
        }  
        return test;  
    }       
    public RSA(BigInteger e, BigInteger d, BigInteger N) {  
        this.e = e;  
        this.d = d;  
        this.N = N;  
    }  

    public byte[] encrypt(byte[] message) {       
        return (new BigInteger(message)).modPow(e, N).toByteArray();  
    }  

    public byte[] decrypt(byte[] message) {  
        return (new BigInteger(message)).modPow(d, N).toByteArray();  
    }  

    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        RSA objRSA;
        objRSA = new RSA();
        int intC=0;

        byte[] encrypted = objRSA.encrypt("hello bhai jan kia haal hein aaq k hyl".getBytes());
        String decrypted = new String (objRSA.decrypt(encrypted));
        System.out.println("encrypted: "+ encrypted);
        System.out.println("decrypted: "+ decrypted);         
    }

}

person David    schedule 07.05.2014    source источник
comment
Посмотрите на это, это может объяснить, почему у вас возникают проблемы с большим открытым текстом: stackoverflow.com/questions/11822607/   -  person mwhs    schedule 07.05.2014
comment
Это не работает, как ожидалось, это очень расплывчатый термин, если вы столкнулись с ошибкой, всегда вставляйте сообщение об ошибке, если ваш код ведет себя не так, как ожидалось, всегда четко указывайте, что вы ожидали и что на самом деле сделал код, чтобы мы могли вам помочь   -  person LionC    schedule 07.05.2014
comment
Я думаю, что его проблема заключается в неправильном понимании того, как использовать RSA. Его следует использовать только как строительный блок в криптопротоколе, а не как алгоритм для шифрования всей полезной нагрузки. Приведенный выше код работает, как и ожидалось. Проблема в пользователе :-)   -  person mwhs    schedule 07.05.2014
comment
Учебник RSA не может зашифровать ничего большего, чем модуль (это модульное возведение в степень, так что это не должно быть сюрпризом). Безопасные режимы RSA (например, OAEP) определяют заполнение, добавляя дополнительные служебные данные, которые необходимо вычесть из максимального размера сообщения.   -  person Maarten Bodewes    schedule 07.05.2014
comment
@owlstead На этот раз это ты с ответом-комментарием ;) Я тебя заразил?   -  person CodesInChaos    schedule 08.05.2014
comment
@CodesInChaos Вы привели меня туда, вместо этого опубликовали как ответ - я немного ошеломлен тем, что вы нашли этот комментарий, который должен был быть ответом. Вы же не писали пауку его искать, надеюсь? :)   -  person Maarten Bodewes    schedule 08.05.2014
comment
Сообщение @LoinC расшифровывается неправильно и не проходит через какое-либо исключение, т. е. оно показывает расшифрованное сообщение, поскольку оно все еще зашифровано.   -  person David    schedule 08.05.2014
comment
Итак, ответ заключается в том, что RSA не следует использовать для шифрования огромного количества данных, а только ключ?   -  person David    schedule 08.05.2014


Ответы (1)


Общий ответ

«учебник» RSA не может зашифровать что-либо большее, чем модуль (это модульное возведение в степень, так что это не должно быть сюрпризом). Безопасные режимы RSA, например OAEP, используют заполнение, создавая дополнительные накладные расходы. Таким образом, эти накладные расходы необходимо вычесть из размера модуля, чтобы получить максимальный размер сообщения, которое может быть зашифровано. Необработанный или учебник RSA (просто модульное возведение в степень) небезопасен; требуется безопасный режим заполнения, такой как OAEP.

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

Только для практики

Пока вы держите вход RSA необработанного / учебника меньше, чем модуль, все должно быть в порядке. Это может означать, что вам придется перебазировать или разделить элементы данных (например, использовать US-ASCII или значения 0..25 для букв вместо UTF-16, в которой для каждого символа используется два байта).

person Maarten Bodewes    schedule 07.05.2014