RSA加密算法如何保证0<m<n,也就是说密文M需要大于零,并且小于指数。

 

先说规则:

如果秘钥长度为1024比特(128字节),那么明文M的字节长度不能超过117。

keyPairGenerator.initialize(1024);

如果秘钥长度为2048比特(256字节),那么明文M的字节长度不能超过245。

keyPairGenerator.initialize(1024);

为什么是117个字节和245个字节,那是因为RSA加密之前规定需要对明文M进行PKCS1.5方式填充,填充的长度最少为11个字节。所以117+11=128字节,245+11=256字节。

 

问题:

假设我们的秘钥长度是1024(128字节)。

我们的明文M是117个字节,经过填充+11个字节,正好等于128个字节 即 M=117+11=128。

那么此时的M也是128个字节,指数N也是128个字节,那如果保证M小于N呢。

答案:

那是因为我们虽然在代码中指定了N=128,但实际上生成秘钥的时候会比128个字节大一些。

	public static void main(String[] args) throws Exception {
		KeyPairGenerator keyPairGenerator= KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(1024);	//128 byte	
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		
		RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) keyPair.getPrivate();
		
		BigInteger n = privateKey.getModulus();
		BigInteger p = privateKey.getPrimeP();
		BigInteger q = privateKey.getPrimeQ();
		
		System.out.println("n :" + n.toString());
		
		System.out.println("n = p*q : " + n.equals(p.multiply(q)));
		System.out.println("n bit length :" + n.toByteArray().length);
	}

 

n :92830397669483958803155580752157787309989795266761117665543345337860925810152371861421581990968908705035899884054955156029955621068112609831092345992991931041314991380374821342101485453239801470166403473867600314835836764891860764399308597235033877633630135129666286064261342678582852777212608854217443044661
n = p*q : true
n bit length :129
 

n:就是大质数,也叫指数

p,q 是对N的质因数分解,所以 n=p*q

再看N的字节长度为129,我们虽然在生成秘钥的地方指定了1024,但实际上生成指数N的时候会比1024稍微大一些,这就保证了N的值永远大于128个字节的M。