密码学RSA算法C语言实现

西南科技大学 密码学基础 rsa算法C实现

RSA算法的具体描述如下:
(1)任意选取两个不同的大素数p和q计算乘积 ;
(2)任意选取一个大整数e,满足 ,整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用) ;
(3)确定的解密钥d,满足 ,即 是一个任意的整数;所以,若知道e和,则很容易计算出d ;
(4)公开整数n和e,秘密保存d ;
(5)将明文m(m<n是一个整数)加密成密文c,加密算法为

(6)将密文c解密为明文m,解密算法为

然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密
随机密钥生成函数

实现函数如下,c语言代码,不是完整代码仅展示函数部分,文本加密文件需要自己设定,基本函数都给出。

int fandkey()
int a;
	a=rand()%1000;
	if(miller_ranbin(a,t)==1) return a;
	else return fandkey(t);

素性检验


miller_ranbin()
int s=0;int r=n-1;int i,j;
 	int sum,a,b;
 	while(!(r&1))//x分解成(2^s)*r 
 	{
    
    
 		s++;
 		r>>=1;
	 }
	 for(i=0;i<t;i++)//重复t次 
	 {
    
    
	 	a=rand()%(n-2)+2;//生成一个【2,n】的随机底数 
	 	if(gcd(a,n)>1) return 0; //测试不通过,合数 
	 	sum=pow(a,r); 
	 	b=sum%n;//计算出a ^rmodn 
	 	if(b==1||b==n-1) continue;//测试通过,进行下一轮测试 
	 	for( j=1;j<s;j++)//进行s-1次平方 
	 	{
    
    
	 		b=(b*b)%n;
	 		if(b==n-1)
	 		{
    
    
	 			break;//测试通过 
			 }
		 }
		 if(j==s) return 0;//不通过,合数 
	 }
	 return 1;//重复t次,测试通过

```c
快速模幂算法int pow_mod()
(a*b) Mod c = [(a Mod c)*(b Mod c)] Mod c  
An = (An-1*Kn) % c
当bn取0时,Kn=1.当bn取1时,Kn = (a2^n)  %  c
Kn = (a2^n)  %  c 
Tn= (a2^n)  %  c;   = ( Tn-1 * Tn-1 ) % c
	int y=1;   //结果的保存,就是yn,初始化一下
        int T=a%c;     //首先计算T0的值,用于Tn的递推  
        while(b!=0)  
        {
    
      
          //这个if是判断目前最右边的一位bn是不是1,如果是1,那么Kn=Tn直接用Tn递推,具体看
		  //上面原理,如果bn=0,那么Kn=1,考虑到yn-1是小于c的,所以 yn=(yn-1)%c =yn-1 就是说可以不用计算了 因为相当于直接 y=y 
		  
		  if(b&1)// 与运算,判断奇偶性
		  {
    
    
           y = ( y * T ) % c;
       }            
       b>>=1;           
       T=(T*T)%c;      
   }     
   //printf("%d\n",y);
   return y;  

孙子定理

int crt()
 
	dp=d%(p-1),dq=d%(q-1);//求出dp=dmod(p-1),dq=dmod(q-1) 
	p_mod=EGCD(p,q); //求p-1modq
	q_mod=EGCD(q,p); //求q-1modp
	int x_1,x_2,m;
	x_1=pow_mod(x%p,dp,p);//快速模幂 
	x_2=pow_mod(x%q,dq,q);//快速模幂 
	m=(((x_1*q*q_mod)%n+(x_2*p*p_mod)%n))%n;
	if(m<0) m+=n;
	return m; 

rsa加密/解密算法

void encrypt()
用快速模幂算法int pow_mod()
RSAencryptData=pow_mod(ch,e,n);
用孙子定理 int crt()
void decrypt()
RSAdecryptData=crt(p,q,e,d,n,ch);
6.扩展欧几里得和欧几里得
int EGCD()
int a,a1,b,b1,c,d,q,r,t;
    a1=b=1,a=b1=0,c=m,d=n;//置a1=b=1;a=b1=0;c=m;d=n;
    while(1)
    {
    
    
        q=c/d,r=c%d;//计算q和r 使得c=q*d+r
        if(r==0)//若r==0;则返回a,(a*m+b*n=d)
        {
    
    
            return a;
        }
        c=d,d=r,t=a1,a1=a,a=t-q*a,t=b1,b1=b,b=t-q*b;
}
Int gcd()
while(a%b)
    {
    
    
        t=b;
        b=a%b;
        a=t;
    }
return b;

代码有不稳定性,可能崩溃。

猜你喜欢

转载自blog.csdn.net/gy0797/article/details/127954565
今日推荐