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