RSA Java кодът не работи за въвеждане на по-голям текст?

Намерих този 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