非対称アルゴリズムのElGamalアルゴリズム-C ++実装

1. ElGamalアルゴリズムの概要

       アルゴリズムの複雑さは、ランダム暗号化に属する離散対数難易度問題(DLP)基づいています(キーがランダムに選択されるため)。

第二に、知識

       グループリングドメイン相関

  1. 循環グループ
  2. 元の要素を求めて
  3. 逆要素

3、C ++コードの実装

1 #include <iostream>
 2 #include <cstdio>
 3  名前空間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      リターン%再MOD。
17  }
 18  
19 ll byy(ll lp){ // 求Zlp *的本原元
20      bool フラグ;
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(のフラグ)を返すIを、
 29      }
 30  }
 31である 
32 LL INV(LLラ、LL LP){ // 反転さ-拡張ユークリッドアルゴリズム
33は     IF(LA == 1リターン 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      (Page %lld "、&r);
 62  
63      エンコード(a、p、y、r);   // 暗号化
64      デコード(x、p);   // 復号
65 }

第四に、スクリーンショットを達成する

おすすめ

転載: www.cnblogs.com/priester-three/p/12689203.html
おすすめ