예제 #1
0
/* generate an RSA key pair */

    public static void KEY_PAIR(RAND rng, int e, rsa_private_key PRIV, rsa_public_key PUB)
    {     // IEEE1363 A16.11/A16.12 more or less
        int n  = PUB.n.getlen() / 2;
        FF  t  = new FF(n);
        FF  p1 = new FF(n);
        FF  q1 = new FF(n);

        for (;;)
        {
            PRIV.p.random(rng);
            while (PRIV.p.lastbits(2) != 3)
            {
                PRIV.p.inc(1);
            }
            while (!FF.prime(PRIV.p, rng))
            {
                PRIV.p.inc(4);
            }

            p1.copy(PRIV.p);
            p1.dec(1);

            if (p1.cfactor(e))
            {
                continue;
            }
            break;
        }

        for (;;)
        {
            PRIV.q.random(rng);
            while (PRIV.q.lastbits(2) != 3)
            {
                PRIV.q.inc(1);
            }
            while (!FF.prime(PRIV.q, rng))
            {
                PRIV.q.inc(4);
            }

            q1.copy(PRIV.q);
            q1.dec(1);

            if (q1.cfactor(e))
            {
                continue;
            }

            break;
        }

        PUB.n = FF.mul(PRIV.p, PRIV.q);
        PUB.e = e;

        t.copy(p1);
        t.shr();
        PRIV.dp.set(e);
        PRIV.dp.invmodp(t);
        if (PRIV.dp.parity() == 0)
        {
            PRIV.dp.add(t);
        }
        PRIV.dp.norm();

        t.copy(q1);
        t.shr();
        PRIV.dq.set(e);
        PRIV.dq.invmodp(t);
        if (PRIV.dq.parity() == 0)
        {
            PRIV.dq.add(t);
        }
        PRIV.dq.norm();

        PRIV.c.copy(PRIV.p);
        PRIV.c.invmodp(PRIV.q);

        return;
    }