Обработка больших целых чисел в реализации RSA

Я пытаюсь реализовать шифрование RSA в Java с большими целыми числами, когда, очевидно, модуль генерируется случайным образом из простых чисел 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);

person user1584314    schedule 06.11.2012    source источник
comment
Не избавляйтесь от начального 0 байта, он принадлежит ему. Байтовое кодирование BigInteger в Java совместимо со схемой, называемой кодировкой DER. Если старший байт положительного BigInteger равен ›= 128, то правильным кодированием будет префикс результата с байтом 00.   -  person President James K. Polk    schedule 07.11.2012


Ответы (1)