1

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

我的问题是,有时模数会出现 257 个字节,其中第一个字节为 0,而第二个总是以 1 开头(1* *) (星 = 任何 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);
4

1 回答 1

2

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

于 2012-11-07T12:36:12.387 回答