求助!!请高手们帮忙把下面的这段c代码改写成相应的c#代码!谢谢!!...
时间:2010-08-18 来源:A180108103
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define mpi_swap(p, q) \
(p) = (p) + (q); \
(q) = (p) - (q); \
(p) = (p) - (q)
typedef long long *MPI;
typedef struct {
MPI n; /* modulus */
MPI e; /* exponent */
} RSA_public_key;
typedef struct {
MPI n; /* public modulus */
MPI e; /* public exponent */
MPI d; /* exponent */
MPI p; /* prime p. */
MPI q; /* prime q. */
MPI u; /* inverse of p mod q. */
} RSA_secret_key;
void
mpi_gcd( MPI *g, MPI xa, MPI xb )
{
MPI a = (MPI)malloc(sizeof(long long));
MPI b = (MPI)malloc(sizeof(long long));
*a = *xa;
*b = *xb;
while(*b > 0) {
*(*g) = (*a) % (*b);
(*a) = (*b);
(*b) = *(*g);
}
*g = a;
}
void
mpi_invm( MPI *x, MPI a, MPI n )
{
MPI u = (MPI)malloc(sizeof(long long));
MPI v = (MPI)malloc(sizeof(long long));
MPI u1, u2, u3, v1, v2, v3, q, t1, t2, t3;
*u = *a;
*v = *n;
u1 = (MPI)malloc(sizeof(long long));
*u1 = 1;
u2 = (MPI)malloc(sizeof(long long));
*u2 = 0;
u3 = v;
v1 = (MPI)malloc(sizeof(long long));
*v1 = 0;
v2 = (MPI)malloc(sizeof(long long));
*v2 = 1;
v3 = u;
q = (MPI)malloc(sizeof(long long));
t1 = (MPI)malloc(sizeof(long long));
t2 = (MPI)malloc(sizeof(long long));
t3 = (MPI)malloc(sizeof(long long));
while( (*v3) != 1) {
(*q) = (*u3) / (*v3);
(*t1) = (*v1) * (*q);
(*t2) = (*v2) * (*q);
(*t3) = (*v3) * (*q);
(*t1) = (*u1) - (*t1);
(*t2) = (*u2) - (*t2);
(*t3) = (*u3) - (*t3);
(*u1) = (*v1);
(*u2) = (*v2);
(*u3) = (*v3);
(*v1) = (*t1);
(*v2) = (*t2);
(*v3) = (*t3);
printf("u1 = %lld\tu2 = %lld\tu3 = %lld\nv1 = %lld\tv2 = %lld\tv3 = %lld\n\n", (*u1), (*u2), (*u3), (*v1), (*v2), (*v3));
}
*(*x) = (*v2)+(*n);
}
void generate( RSA_secret_key *sk)
{
MPI p = (MPI)malloc(sizeof(long long));
MPI q = (MPI)malloc(sizeof(long long)); /* the two primes */
MPI d = (MPI)malloc(sizeof(long long)); /* the private key */
MPI u = (MPI)malloc(sizeof(long long));
MPI t1 = (MPI)malloc(sizeof(long long)), t2 = (MPI)malloc(sizeof(long long));
MPI n = (MPI)malloc(sizeof(long long)); /* the public key */
MPI e = (MPI)malloc(sizeof(long long)); /* the exponent */
MPI phi = (MPI)malloc(sizeof(long long)); /* helper: (p-1)(q-1) */
MPI g = (MPI)malloc(sizeof(long long));
MPI f = (MPI)malloc(sizeof(long long));
*p = *q = 0;
/* select two (very secret) primes */
printf("\n====== INPUT ======\n");
printf("Both p and q should be\nless than 65536\np should be less than or equal to q\n");
printf("p = ");
scanf("%lld", p);
printf("q = ");
scanf("%lld", q);
/* calculate the modulus */
(*n) = (*p) * (*q);
(*t1) = (*p) - 1;
(*t2) = (*q) - 1;
(*phi) = (*t1) * (*t2);
mpi_gcd(&g, t1, t2);
(*f) = (*phi) / (*q);
(*e) = 13;
do{ mpi_gcd(&t1, e, f);
if((*t1) != 1 ) /* (while gcd is not 1) */
(*e) += 2;
else
break;
}while(1);
mpi_invm(&d, e, phi );
u = (MPI)malloc(sizeof(long long));
mpi_invm(&u, p, q );
sk->n = n;
sk->e = e;
sk->p = p;
sk->q = q;
sk->d = d;
sk->u = u;
}
void
public_f(RSA_public_key *pkey )
{
MPI output = (MPI)malloc(sizeof(long long));
double tmp = pow(5.000000,(double)(*(pkey->e)));
*output = (long long)tmp % (*(pkey->n));
printf("output = %lld\n", *output);
}
int main()
{
int i;
RSA_secret_key *sk = (RSA_secret_key *)malloc(sizeof(RSA_secret_key));
generate( sk);
RSA_public_key *pkey = (RSA_public_key *)malloc(sizeof(RSA_public_key));
pkey->e = sk->e;
pkey->n = sk->n;
//public_f(pkey);
printf("n = %lld\n",*(sk->n));
printf("e = %lld\n",*(sk->e));
printf("p = %lld\n",*(sk->p));
printf("q = %lld\n",*(sk->q));
printf("d = %lld\n",*(sk->d));
printf("u = %lld\n",*(sk->u));
long long P,C;
printf("input a ming wen:");
scanf("%lld",&P);
C=P;
for(i=1;i<(*(sk->e));i++)
{
C=((C%(*(sk->n)))*(P%(*(sk->n))))%(*(sk->n));
}
//C=(long long)pow(1.000000,(double)(*(sk->e))) % (*(sk->n));
printf("mi wen:%lld\n",C);
P=C;
for(i=1;i<(*(sk->d));i++)
{
P=((P%(*(sk->n)))*(C%(*(sk->n))))%(*(sk->n));
}
//P=(long long)pow((double)C,(double)(*(sk->d))) % (*(sk->n));
printf("ming wen:%lld",P);
return 0;
}