// Programa que gera os elementos necessarios para // um esquema RSA. // // Entrada: tamanho (em digitos decimais) dos // primos, semente para aleatorio // // Saida: p, q, b, e, f #include // cin, cout, etc. #include // atoi #include // multiplicative linear congruential // random number generator #include // random integer generator #include //-------------------------------------------------- // constantes const int NARGS = 2; const int BASE = 10; MLCG gen; // rnd vai gerar digitos decimais RandomInteger rnd(BASE-1,&gen); //======================================================== // funcoes //---------------------------------------- // retorna numero aleatorio Integer aleatorio (int ndigitos) { Integer a = 0; for(int i=0; i= 0 // (sabemos que f nao vai ser menor que -n) if (f < 0) { f += n; k -= e; } } } //================================================== // programa principal main(int argc, char ** argv) { //---------------------------------------- // le parametros e inicializa if (argc <= NARGS) { cerr << "Usage: " << argv[0] << " \n"; exit(1); } int ndigitos = atoi(argv[1]); int seed = atoi(argv[NARGS]); gen.reseed(seed,1); //---------------------------------------- // gera primos Integer p = primo(ndigitos); Integer q = primo(ndigitos); Integer b = p*q; //---------------------------------------- // gera chaves Integer f, k, d; Integer e = aleatorio(ndigitos+ndigitos) % b; mdcEstendido(e,b-p-q+1,f,k,d); while (d != 1) { e = aleatorio(ndigitos+ndigitos) % b; mdcEstendido(e,b-p-q+1,f,k,d); } cout << "p: " << p << "\n"; cout << "q: " << q << "\n"; cout << "b: " << b << "\n"; cout << "e: " << e << "\n"; cout << "f: " << f << "\n"; exit(0); }