RSA加密算法的实现

#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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值