RSA加密算法的实现

来源:互联网 发布:linux pv命令 编辑:程序博客网 时间:2024/05/16 05:36
#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>int Is_Prime(int m)                 //判断是否为素数{    int k,i;    k=(int)sqrt(m);     for(i=2;i<=k;i++)          if(m%i==0)                  break;     if(i>k)             return 1;     else            return 0;}void legal(int* tp,int* tq)             //输入两个素数并检测合法性{    while(1)    {        printf("输入两个素数并用空格隔开:\n");        scanf("%d%d",tq,tp);        if(Is_Prime(*tq))            if(Is_Prime(*tp))                break;            else             {                system("CLS");                printf("%d不是素数请重新输入,",*tp);            }        else        {            system("CLS");            printf("%d不是素数请重新输入,",*tq);        }    }}int MYHF(int tk,int tl)                 //秘钥合法性检测{    int temp;    while(tk!=0)    {        temp=tl%tk;        tl=tk;        tk=temp;    }    if(tl==1)        return 1;    else        return 0;}void miyao(int * tsk,int ol)            //输入秘钥{    while(1)    {        printf("输入秘钥,秘钥与%d互质\nsk=",ol);        scanf("%d",tsk);        if(MYHF(*tsk,ol))            break;        else            printf("秘钥要与%d为互质数:",ol);    }}int GY(int tsk,int tr)                  //  公钥{    int b1,b2,s,ys,tmp;             //s 商,ys 余数 tmp 临时存数    b1=0,b2=1;    while(tsk!=1)    {        s=tr/tsk;        ys=tr%tsk;        tmp=b2;        b2=b1-b2*s;        b1=tmp;        tr=tsk;        tsk=ys;    }    return b2;}int jiami(int sk,int m,int r)                       //  加密{    int i;    double t1;    double  c,tc;    c=1,t1=1,i=0;    char string[30];    itoa(sk,string,2);                          //10进制转换为2进制    i=strlen(string)-1;                         //获得二进制位数    for(int j=0;j<=i;j++)    {           c=fmod(c*c,r);        if(string[j]=='1')        {            tc=c;            c=fmod(c*m,r);        }    }    t1=(int)ceil(c);    return t1;      }int main(void){    int q,p,r,ol,sk,pk,mw,pm,gy;            //r 公开模函数,ol 欧拉函数,sk 秘钥,pk 公钥    legal(&q,&p);    r=q*p;    ol=(p-1)*(q-1);    printf("q=%d,p=%d,r=%d,ol=%d \n",q,p,r,ol);    miyao(&sk,ol);    pk=GY(sk,ol);    printf("pk=%d \n",pk);    printf("输入需要加密的内容:");    scanf("%d",&pm);    system("CLS");    printf("明文为=%d\n",pm);    pm=jiami(sk,pm,r);    printf("密文为=%d\n",pm);    printf("输入公钥解密加密的内容:");    scanf("%d",&gy);    printf("解密内容为:%d\n",jiami(gy,pm,r));}
0 0
原创粉丝点击