RSA java代码不适用于较大的文本输入?

时间:2014-05-07 11:46:57

标签: java encryption cryptography public-key-encryption encryption-asymmetric

我在网上找到了这个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);         
    }

}

1 个答案:

答案 0 :(得分:2)

通用答案

“教科书”RSA不能加密大于模数的任何东西(它是模幂运算,所以这不应该是一个惊喜)。 RSA的安全模式 - 例如OAEP - 使用填充,从而产生额外的开销。因此,需要从模数的大小中减去此开销,以获得可加密的消息的最大大小。原始或教科书RSA(只是模幂运算)不安全;需要安全的填充模式,例如OAEP。

要解决此问题,您应该将hybrid encryption用于实际目的。请注意,should not simply split the plaintext into block sized parts and encrypt those除了练习目的。

仅限练习

只要您保持原始/教科书RSA的输入小于模数,您应该没问题。这可能意味着您必须重新分割或拆分数据元素(例如,使用US-ASCII或值0..25代替UTF-16,每个字符使用两个字节)。