Elgamal 加密算法

1、ElGamal算法简介

ElGamal算法是由Tather ElGamal在1985年提出的,它是一种基于离散对数难题的加密体系,与RAS算法一样,既能用于数据加密,也能用于数字签名。ElGamal算法是基于因数分解,而ElGamal算法是基于离散对数问题。与RSA算法相比,ElGamal算法哪怕是使用相同的私钥,对相同的明文进行加密,每次加密后得到的签名也各不相同,有效的防止了网络中可能出现的重放攻击。

2、ElGamal算法原理

1、ElGamal密钥生成
(1)随机选择一个大素数p,且要求p-1有大素数因子。再选择一个模p的本原元α。将p和α公开。
(2)随机选择一个整数d作为密钥,2≤d≤p-2 。
(3)计算y=α^d mod p,取y为公钥。

2、ElGamal加密
(1)对于明文M加密,随机地选取一个整数k,2≤k≤p-2
(2)C1=α^k mod p
(3)C2=MY^k mod p
(4)密文为(C1,C2)

3、ElGamal解密
由密文可得明文M,M=C2/C1^d mod p

3、c语言代码实现

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int pow_mod(int a,int b,int p){
  int ans=1;
  int tmp=a%p;
  while(b){
    if(b&1)
      ans=ans*tmp%p;
    b>>=1;
    tmp=tmp*tmp%p;
  }
  return ans%p;
}

void elgamal_en(int m,int pub,int p,int g,int *c1,int *c2){
  int k=5;
  *c1=pow_mod(g,k,p);
  *c2=m*pow_mod(pub,k,p)%p;
}
int elgamal_de(int c1,int c2,int pri,int p,int g){
  int m;
  int c1_=pow_mod(c1,p-2,p);
  m=c2*pow_mod(c1_,pri,p)%p;
  return m;
}
int is_prime(int p){
  int i;
  for(i=2;i<=sqrt(p);i++){
    if(p%i==0)
      return 0;
  }
  return 1;
}
void main(){
  int p;//素数
  int g=2;

  do{
    printf("请输入一个素数:");
    scanf("%d",&p);
  }while(!is_prime(p));
  
  printf("输入用户A的私钥:");
  int pri;
  scanf("%d",&pri);

  int pub;
  pub=pow_mod(g,pri,p);

  printf("用户A的公钥为:%d\n",pub);
  
  printf("输入明文(小于%d):",p);
  int m;
  scanf("%d",&m);

  int c1,c2;
  elgamal_en(m,pub,p,g,&c1,&c2);
  printf("用公钥加密后的密文为:c1=%d,c2=%d\n",c1,c2);

  int m_=elgamal_de(c1,c2,pri,p,g);
  printf("用私钥解密后的明文为:%d\n",m_);
}

代码参考 https://blog.csdn.net/Evil_invisible/article/details/101201632

4、测试结果

在这里插入图片描述

  • 24
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值