⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ran.c

📁 加密解密现代密码学的内容c语言编写uoto
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

int gcd(unsigned long a,unsigned long b);
int Is_Prime(unsigned int p);
unsigned power(unsigned a,unsigned b,unsigned long c);



main()
{
    unsigned int p=10,q=10;
    unsigned long n;

    srand(time(NULL));


    while(!Is_Prime(p))
    p=50000+rand()%10000;
    while(!Is_Prime(q))
    q=10000+rand()%55535;
    n=(unsigned long)p*(unsigned long)q;

    printf("p= %u\n",p);
    printf("q= %u\n",q);
    printf("n= %lu\n-------------------\n",n);

    getchar();
    printf("%d\n",Is_Prime(47));
     getchar();
}

int gcd(unsigned long a,unsigned long b)
{
 unsigned long x,y,r ;  x=a; y=b;
 while(1){
 if(y==0)
    return 0;
 if(y==1)
    return 1;
 r=x%y;
 x=y;
 y=r;}
}

int Is_Prime(unsigned int p)
{
    int i;

    for(i=2;i<sqrt(p);i++)
        if((p%i)==0)
            return 0;

    return 1;
}


unsigned power(unsigned a,unsigned b,unsigned long c)
{
 /*此函数计算"a的b次方对c求余"*/

 unsigned long z=1,t;
 for(t=a;b>0;b>>=1)
 {
  /*每轮循环b右移1位是为了控制循环次数,可如下等价理解:*/
  /*将b写成二进制形式:mk,mk-1,mk-2------m0.其中k就是循环次数*/

  /* 在以下的注释中: "a(mk)"代表"a的mk次方","(a)(b)"代表"a的b次方",*/
  /* "[a]*[b]"代表"a*b"*/

  /* 此函数的原理是:*/
  /* b写成二进制形式后,"a的b次方"=a(b)=[(a(mk))(2(k))]*[(a(mk-1))(2(k-1))]*   */
  /* [(a(mk-2))(2(k-2))]----*[(a(m0))(2(0))].由此可见mi=0的项的值=1,因此这一项*/
  /* 不用累乘到"a的b次方"中,只有当mi=1时,才将[(a(mi))(2(i))]累乘到"a的b次方"中*/

   if(b%2==1)z=(z*t)%c;  /*z用来存放当前的"a的b次方"*/

   /* "b%2==1"说明b是奇数.当b是奇数时,b的二进制表示的最低位是1.又因为每次循环b*/
   /* 都右移1位,因此此时b的最低位其实是传入此函数的b的二进制表示的第j位*/
   /* j表示当前的循环次数,从0开始,二进制表示的位数从0开始. */

   /*对于传入此函数的b, 若其二进制表示第j位为1,即mj=1,则根据上面提到的此函数的*/
   /*原理,应将mj,mj-1,mj-2-------m0表示的十进制数(即[(a(mj))(2(j))])累乘到z中*/
   /*而[(a(mj))(2(j))]就是t*/

   t=(t*t)%c;

   /* 此函数实际操作时:*/
   /* t存放当前"a的i次方"的值(i=1,2,3----k)*/
   /* [(a(m))(2(i))]的值*/

  }
  return z;
 }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -