Реализация цифровой подписи ГОСТ

Начал реализацию цифровой подписи ГОСТ. Нужно сделать так: Прежде всего необходимо найти два простых числа, q длиной 256 бит и p длиной 1024 бита, между которыми выполняется соотношение

p = bq + 1 

для некоторого целого b. Старшие биты в p и q должны быть равны единице. Затем выбирается число a > 1, такое, что

a^q mod p = 1

У меня не получается сгенерировать число a, попробовал вот так:

    BigInteger q = BigInteger.probablePrime(256, random);
    BigInteger p = BigInteger.probablePrime(1024, random);
    BigInteger b = (p.subtract(BigInteger.ONE)).divide(q);
    BigInteger a = null;

    do {
        a = new BigInteger(256, random);
        System.out.println(cryptoLab1.ModPow(a,q,p));
    } while (cryptoLab1.ModPow(a,q,p).intValue() != 1);

Как можно сгенерировать число a согласно условию выше?


Ответы (0 шт):