1. ElGamalアルゴリズムの概要
アルゴリズムの複雑さは、ランダム暗号化に属する離散対数難易度問題(DLP)に基づいています(キーがランダムに選択されるため)。
第二に、知識
グループリングドメイン相関
- 循環グループ
- 元の要素を求めて
- 逆要素
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 }
第四に、スクリーンショットを達成する