RSA - шифрование с отрицательным показателем степени - PullRequest
1 голос
/ 24 февраля 2012

Ну, ребята, я пытаюсь зашифровать (на самом деле подписать) данные с использованием открытых и частных показателей и модулей. Это в C # .NET, и я не могу использовать RSACryptoServiceProvider, потому что для этого нужны и простые числа, и другие элементы CRT.

Итак, я пытаюсь сделать следующее:

private Byte[] signData()
{
  BigInteger biPrivEx = new BigInteger(this.privEx); // Those are byte[]
  BigInteger biPubEx = new BigInteger(this.pubEx);
  BigInteger biMod = new BigInteger(this.mod);          

  BigInteger cyph = BigInteger.ModPow(new BigInteger(pkcs11), biPrivEx, biMod); // This raise exception

  return cyph.ToByteArray();;
}

Но проблема в том, что я получаю Out Of Range Exception, потому что мой частный показатель отрицателен.

Что яделать неправильно?Или возможно легко восстановить ЭЛТ из этого?Или, может быть, есть ли лучший способ, как это сделать?В другой программе я могу сделать это с данными, которые я использую, поэтому у меня есть ссылка для проверки.

1 Ответ

1 голос
/ 24 февраля 2012

Проблема в том, что вы получили отрицательный личный показатель в первую очередь.В зависимости от того, как вы получили этот разбитый показатель степени, попробуйте:

  1. Добавление n к нему
  2. Заключение байта 00 в массив для правильного анализа.

Вы также должны быть осторожны с проблемами порядка байтов.BigInteger .net использует little endian, другие двоичные форматы могут использовать big endian.


Попробуйте:

BigInteger ParseBinaryLE(byte[] raw)
{
   return new BigInteger(raw.Concat(new byte[]{0}).ToArray());
}

BigInteger ParseBinaryBE(byte[] raw)
{
   return new BigInteger(raw.Reverse().Concat(new byte[]{0}).ToArray());
}

AFAIK также возможно восстановить Pи Q (и из тех остальных параметров), когда вы знаете e, d и n.

...