TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
Answers
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Forums
Monthly Leaders
Forum guidelines
Adesanya Olusegun
NA
19
26.7k
i want to conver this piece of code written in C to C#
Apr 3 2014 3:09 PM
// Provides the key generation functions
//MAX and MIN values for random numbers
unsigned int MAX=256;
unsigned int MIN=1;
//function to calculate the multiplicative inverse of e mod r, using the
extended Euclidean algorithm
int gencongrel (unsigned int e, unsigned int r)
{
long temp, u, v, quotient, previous_u, previous_v;
u = 0;
previous_u = 1;
v = 1;
previous_v = 0;
while (r != 0) //keep calculating until it reaches 0
{
temp = r; //store the old value
quotient = e / r; //quotient of e and r
r = e % r; //calculate the new value, e mod r
e = temp; //restore the old value
temp = u; //store the old value
u = previous_u - quotient * u; //calculate the new u using the previous
one and quotient
previous_u = temp; //restore the old value
temp = v; //store the old value
v = previous_v - quotient * v; //calculate the new v using the previous
one and exponent
previous_v = temp; //restore the old value
}
return (previous_u);
}
//function to calculate the greatest common denominator of two numbers,
using the Euclidean algorithm
int gcd(unsigned int number, unsigned int r)
{
unsigned int temp;
while (r != 0 ) //keep calculating until it reaches 0
{
temp = r; //store the old value
r = number % r; //calculate the new value, number mod r
number = temp; //restore the old value
}
return number;
}
//function to generate a number coprime to r called from gen_keys
int gencoprime(unsigned int r)
{
unsigned int number;
do
{
do //Generate a random number between MIN and MAX
{
number = rand() % MAX;
} while (number < 3);
} while (gcd(number, r) != 1); //keep generating numbers until the gcd of
the generated number and r is 1
return (number);
}
//function to generate prime numbers, called from gen_keys
int genprime (void)
{
unsigned int modulus, modulus_squared, prime, number, result;
prime = 0; //Assume the number is not prime
result = 0;
while (prime == 0) //While it is not prime
{
modulus = 2; //Can start at 2 dividing by 1 not needed
modulus_squared = 4;
do //Generate a random number between MIN and MAX
{
number=rand() % MAX;
} while (number < MIN);
while (modulus_squared < number) //Only need to check up to the square
root of the number
{
result = number % modulus; //The result is the remainder after
dividing the number by the current modulus
if (result == 0) //If the remainder is 0
{
prime = 0; //The number is not prime
break;
}
modulus_squared = modulus * modulus;
if (modulus == 2) //If the current modulus is 2
{
modulus++; //Add one to make next modulus 3
}
else
{
modulus++; //Otherwise add 2 to keep modulus odd
modulus++;
}
}
if (result != 0) //If the result is 0 when divided by all numbers up to
the square root of the number
{
prime = 1; //Number must be prime
}
}
return (number);
}
//key generation function called from menu.c
int gen_keys (void)
{
unsigned int p, q, e, n, r;
long d;
int error;
srand(time(NULL)); //randomise the random number generator
error = 1;
do //generate two different prime numbers
{
p = genprime();
q = genprime();
} while (q == p);
n = p * q; //n is the product of p and q
r = (p - 1) * (q - 1); //r is the totient of p and q
e = gencoprime(r); //e is coprime to r
d = gencongrel(e, r); //d is the multiplicative inverse of e mod r
if (d <= 0)
{
d = d + r; //d must be positive so calculate d + r to get d mod r
}
//Write the key files
FILE *fptr;
fptr = fopen("private_key.txt","w");
if (fptr != NULL) //check the file was opened correctly
{
fprintf(fptr,"%ld %d\n", d, n); //write the values
fflush(fptr);
fclose(fptr);
error = 0;
}
fptr = fopen("public_key.txt","w");
if ((fptr != NULL) || (error == 0)) //check the file was opened correctly
fprintf(fptr,"%d %d\n", e, n); //write the values out
fflush(fptr);
fclose(fptr);
error = 0;
}
else
{
error = 1;
}
if (error == 0)
{
printf("\nKEY GENERATION SUCCESSFULL\n\n\n"); //if there wasn't an
error
}
else
{
printf("\nERROR: KEY GENERATION UNSUCCESSFULL\n\n\n"); //if there was
an error
return(1);
}
return(0);
}
Reply
Answers (
4
)
Random Generic Class
[C#] Getting a NullReferenceException on a Timer method.