非對稱算法之ElGamal算法——C++實現


一,ElGamal算法介紹

       該算法的復雜性理論基礎為離散對數困難問題(DLP),屬於隨機性加密(由於密鑰是隨機選取的)。

二,知識

       群環域相關

  1. 循環群
  2. 求本原元
  3. 求逆元

三,C++代碼實現

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 ll p,a,x,y,r,c1,c2,m;
 7 
 8 ll qpow(ll r, ll n, ll mod){//計算a^n % mod
 9     ll re = 1;
10     while(n){
11         if(n & 1)
12             re = (re * r) % mod;
13         n >>= 1;
14         r = (r * r) % mod;
15     }
16     return re % mod;
17 }
18 
19 ll byy(ll lp){//求Zlp*的本原元
20     bool flag;
21     for(ll i=2;i<lp;i++){
22         flag=true;
23         for(ll j=2;j<lp-1;j++){
24             if((lp-1)%j==0){
25                 if(qpow(i,j,lp)==1) flag=false;
26             }
27         }
28         if(flag) return i;
29     }
30 }
31 
32 ll inv(ll la, ll lp){//求逆元——擴展歐幾里得算法
33     if(la == 1) return 1;
34     return inv(lp%la,lp)*(lp-lp/la)%lp;
35 }
36 
37 void encode(ll la,ll lp,ll ly,ll lr){
38     printf("\n======加密======\n");
39     c1=qpow(la,lr,lp);
40     c2=(m*qpow(ly,lr,lp))%lp;
41     printf("得到的密文為c1=%lld   c2=%lld\n",c1,c2);
42 }
43 
44 void decode(ll lx,ll lp){
45     printf("\n======解密======\n");
46     c1=qpow(c1,lx,lp);
47     c1=inv(c1,lp);
48     m=(c2*c1)%lp;
49     printf("得到的明文為m=%lld\n",m);
50 }
51 
52 int main(){
53     printf("請輸入參數p並隨機選取密鑰x(0<x<p-1):");
54     scanf("%lld%lld",&p,&x);
55     a=byy(p);
56     y=qpow(a,x,p);
57     printf("計算出本原元a=%lld   公鑰y=%lld\n",a,y);
58     printf("請輸入要加密的明文m(m=Zp*):");
59     scanf("%lld",&m);
60     printf("請輸入隨機產生的參數r(r=Zp*,gcd(r,p-1)=1):");
61     scanf("%lld",&r);
62 
63     encode(a,p,y,r);  //加密
64     decode(x,p);  //解密
65 }

四,實現截圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM