#!/usr/bin/perl

# ( $n, $e, $d ) = generuj_klucze_RSA( $bity, $e );
#       $bity to zadana wielkosc $n 
#          ($p i $q beda o polowe mniejsze)
#       ($e,$n) to klucz publiczny
#       ($d,$n) to klucz prywatny
#       $p i $q nie sa zwracane, gdyz nie beda pozniej potrzebne.
sub generuj_klucze_RSA {
    my ( $bity, $e ) = @_;
    use SSLeay;

    my ( $p, $q, $t );

    do {$p = SSLeay::BN::generate_prime( $bity/2, 0 );
        $t = $p - 1;
    } while $t->gcd($e) == 1;

    do {$q = SSLeay::BN::generate_prime( $bity/2, 0 );
        $t = $q - 1;
    } while $t->gcd($e) == 1;

    my $n = $p * $q;
    # ($p-1)*($q-1) == $n - $p - $q + 1
    $t = $n - $p - $q + 1;

    # Nalezy upewnic sie, czy $e to duza liczba (format BN).
    $e = $p - $p + $e;

    my $d = $e->mod_inverse( $t );

    return ( $n, $e, $d );
}

my ( $n, $e, $d ) = generuj_klucze_RSA( 512, 3 );

