文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>求助!!请高手们帮忙把下面的这段c代码改写成相应的c#代码!谢谢!!...

求助!!请高手们帮忙把下面的这段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;
}

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载