15,917,652 members
See more:
I wrote the following C++ code for generating keys for RSA :

C#
```void keygen(long long int &e_key,long long int &d_key,long long int phival)
{
//Code to find the encryption key.

e_key = genrndnum(2,(phival));

while(gcd(e_key,phival)!=1)
{
e_key = genrndnum(2,(phival-1));
}

//Code to find decryption key.

long long int k =0;
d_key = (1+(k*phival))/e_key;

while(((1+(k*phival))%e_key)!=0)
{
++k;
d_key = (1+(k*phival))/e_key;
}

return;
}```

[Update]

Code for genrndnum().

C#
```long genrndnum(long lower_limit,long upper_limit)
{
srand(time(NULL));
long rdnum =0;

rdnum = lower_limit + (rand() % (int)(upper_limit - lower_limit + 1));

return rdnum;
}```

[End Update]

[Update 2]

Keygen is a function to generate private and public keys.
Here e_key is Public key and d_key the private key. Both are passed by reference.
Then phival is the Euler totient function (ie., phi(x)). (This was calculated sometime earlier , not shown).

I got all these information from wikipedia.

[End Update 2]

[Update 3]

Code for finding gcd().

```long long int gcd(long long int num1 , long long int num2)
{
/*

Returns the Greatest Common Divisor (GCD) of two given numbers.

*/

if(num1 ==0 && num2==0)
{
return 0;
}

if(num1==0)
{
return num2;
}

if(num2 ==0)
{
return num1;
}
long long int remainder = 0;

do
{
remainder = num1%num2;
num1 = num2;
num2 = remainder;

}while(remainder!=0);

return num1;
}```

Input Values for keygen().

The only input value for keygen() is :
`phival = 43392.`

[End Update 3]

[Update 4]

Output values : [Randomly generated]

VB
```p =337
q = 149
phi = 49728
Encryption key = 8893
k = 7
Private key = 39 (There is another problem here : Encryption and Private keys should be the same. No where in the code have i changed e_key during decryption.)

Public key = 39
Modulus = 50213```

[End Update 4]

But i get the same value for Public key and private key. What is the mistake in the code ?
Posted
Updated 18-Jun-13 15:38pm
v6
Richard MacCutchan 18-Jun-13 11:00am
What is the mistake in the code?
You need to provide more information about what results you get against what you expect.
compuknow 18-Jun-13 11:20am
For example , (results I get after running the code) Public key = 5615 , Private key = 5615(which is wrong) , Modulus = 16279. Private and Public keys must be different.
Richard MacCutchan 18-Jun-13 12:06pm
What different values are you using in your functions? As it stands you have not provided nearly enough information.
compuknow 18-Jun-13 12:11pm
Sorry , different values means ? Are you asking the p and q values (ie., the prime numbers).
Richard MacCutchan 18-Jun-13 12:25pm
Well, you have shown us some (but not all) code, and shown a couple of results. We cannot deduce from that what the full code does or what its input values are, so it's impossible to guess what may be going wrong.

## Solution 2

Quote:
long genrndnum(long lower_limit,long upper_limit)
{
srand(time(NULL)); //<================== mistake here
long rdnum =0;

rdnum = lower_limit + (rand() % (int)(upper_limit - lower_limit + 1));

return rdnum;
}

You should not call `srand` every time you need a new random number. You should call it once, before calling `rand` for the very first time.

v2