在RSA实现中处理BigIntegers

时间:2012-11-06 15:04:12

标签: java rsa equation modulus

我正在尝试用大整数在Java中实现RSA加密,显然模数是从q,p primes中随机生成的,每个128字节-1024位。

我的问题是,有时模数出现257个字节,其第一个字节为0,第二个字母始终以1开始(1 * * )( star =无论0 \ 1。)其他时间是正256字节,其中第一个字节以0开头。

当我向modPow发送模数和指数时,我得到:

java.lang.ArithmeticException: BigInteger: modulus not positive

即使我试图删除第一个0字节并保留256个其他字符,我也会遇到此问题。

一些代码示例:

BigInteger p = new BigInteger(1024,20,new Random());
BigInteger q = new BigInteger(1024,20,new Random());
//multiplying p & q and inserting it to modulus
ByteArray modulus = new ByteArray( p.multiply(q).toByteArray());
if (modulus.length()==257)
{
  //if the first byte is 00 then erasing it
  flag =false;
  ByteArray temp = new ByteArray(TypeUtils.subArray(modulus.getByteArray(), 1, 256));
  modulus = temp;
}

BigInteger modulusInBig = new BigInteger(TypeUtils.Byte2byte( modulus.getByteArray()) );
BigInteger answer = inTextInBig.modPow(exponentInBig, modulusInBig);

1 个答案:

答案 0 :(得分:1)

java.math.BigInteger始终在其toByteArray()方法及其BigInteger(byte[])构造函数中使用一个符号位。所以第一个字节的最高位表示符号。如果您有256 * 8位无符号数据,并且该数据中的最高有效位为1,那么您必须有一个额外的0字节来表示该数字是无符号的。删除该字节将使其被解释为负数,并使用您描述的结果。