#include #include #include #include #include #include /* You need a file in your home directory called .rnd that is filled with random garbage in order for this to work! */ int main(int argc, char** argv) { RSA* rsa; int bitlength = 1024; int e = 3; unsigned int temp; unsigned char buf[1024]; if(argc < 2) { printf("Usage: %s bitlength [public_exponent]\n",argv[0]); exit(0); } /* Initialize the random number generator */ if(RAND_load_file(RAND_file_name(buf,1024), -1)<1024) { printf("Random number generator initialization failed.\n"); printf("* You need a file in your home directory called .rnd\n"); printf("* that is filled with atleast 1024 bits of randomness\n"); printf("* in order for this to work!\n"); exit(0); } bitlength = atoi(argv[1]); if(argc == 3) e = atoi(argv[2]); printf("Generating a %d bit key pair (e = %d)... ", bitlength, e); fflush(stdout); /* Generate a 1024 bit key with public exponent 3 */ rsa = RSA_generate_key(bitlength, e, NULL, NULL); if (!rsa) { printf("RSA key generation failed.\n"); ERR_load_crypto_strings(); printf("%s\n",ERR_error_string(ERR_get_error(),NULL)); exit(0); } printf(" complete.\n\n"); printf("Public key parameters:\n"); printf(" Modulus length: %X\n", BN_num_bytes(rsa->n)); printf(" Modulus value:\n"); BN_print_fp(stdout, rsa->n); printf("\n Exponent length: %X\n", BN_num_bytes(rsa->e)); printf(" Exponent value: "); BN_print_fp(stdout, rsa->e); printf("\n\nPrivate key parameters:\n"); printf(" q prime length: %X\n", BN_num_bytes(rsa->q)); printf(" q prime value:\n"); BN_print_fp(stdout, rsa->q); printf("\n p prime length: %X\n", BN_num_bytes(rsa->p)); printf(" p prime value:\n"); BN_print_fp(stdout, rsa->p); printf("\n 1/q mod(p) length: %X\n", BN_num_bytes(rsa->iqmp)); printf(" 1/q mod(p) value:\n"); BN_print_fp(stdout, rsa->iqmp); printf("\n Ksec mod(q-1) length: %X\n", BN_num_bytes(rsa->dmq1)); printf(" Ksec mod(q-1) value:\n"); BN_print_fp(stdout, rsa->dmq1); printf("\n Ksec mod(p-1) length: %X\n", BN_num_bytes(rsa->dmp1)); printf(" Ksec mod(p-1) value:\n"); BN_print_fp(stdout, rsa->dmp1); printf("\n"); RSA_free(rsa); RAND_write_file(RAND_file_name(buf,1024)); }