密码学作业三:ElGamal

本文介绍了一个基于模幂运算实现的加密解密过程,包括模平方运算、逆元求解、加密与解密的具体步骤。通过输入不同的参数,可以进行加密或解密操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include <stdio.h>
int c1 , c2 , p , a , d , m , k , x , y ;

int Mod(int x,int y,int m){//模平方的运算
    int a,b;
    a
=1;
    b
=x;
    
while( y ){
       
if( y % 2 == 1 )
       a 
= a * b % m ;
       y 
/= 2 ;
       b 
= b * b % m ;
    }

    
return a;
}


/**********************************************
*      求逆元  用的是ext_euclid算法         *
**********************************************
*/
 
int Inverse(int a,int b,int &x,int &y)    
{
   
int t,d;
   
if (b==0{ x=1; y=0return a; }
   d
=Inverse(b,a%b,x,y);
   t
=x;
   x
=y;
   y
=t-a/b*y;
   
return d;
}



void  Encry(int p,int a,int d,int m,int k)
{
    
int y , u ;
    y 
= Mod( a , d , p ) ;
    u 
= Mod( y , k , p ) ;
    c1 
= Mod( a , k , p ) ;
    c2 
= u * m % p ;
    printf(
"c1=%d c2=%d ",c1,c2) ;
}


void  Decry(int c1,int c2,int d,int p)
{
    
int v , v_1 , m ;
    v 
= Mod ( c1 , d , p ) ;
    Inverse( v , p , x , y ) ;
    x 
= ( x + p ) % p ; 
    m 
= c2 * x % p ;
    printf(
"m=%d ", m ) ;
}


int main()
{
     
int flag ;     
     
while1 ){
  printf(
"请选择要执行的操作: 1.Encryption  2.Decryption ");         
     scanf(
"%d",&flag);
      
if(1==flag){
         printf(
"please input (p,a,d,m,k): ");
         scanf(
"%d%d%d%d%d",&p,&a,&d,&m,&k);
         Encry( p , a , d , m , k ) ;
        }

     
else{
         printf(
"please input (c1,c2,d,p): ");
         scanf(
"%d%d%d%d",&c1,&c2,&d,&p);
         Decry( c1 , c2 , d , p ) ;
        }

 }

 
return 0;
}

/*
 p = 2579
 a = 2
 d = 765
 m = 1299
 k = 853
*/

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值