我正在尝试用大整数在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);
答案 0 :(得分:1)
java.math.BigInteger
始终在其toByteArray()
方法及其BigInteger(byte[])
构造函数中使用一个符号位。所以第一个字节的最高位表示符号。如果您有256 * 8位无符号数据,并且该数据中的最高有效位为1,那么您必须有一个额外的0字节来表示该数字是无符号的。删除该字节将使其被解释为负数,并使用您描述的结果。