<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      用C語言實現ElGamal算法

      緣起

      是我侄子問的題目,參考了書籍、博客,花了一些時間完成的,丟掉可惜了,記錄下來吧。這個程序還有些缺陷,數值太大時計算結果會溢出

      代碼

      #include<stdio.h>
      #include<time.h>
      #include<stdlib.h>
      
      #define longint long long
      
      // 得到一個隨機數
      int random(int minValue, int maxValue)
      {
      	return rand() % (maxValue - minValue + 1) + minValue;
      }
      
      // 交換兩個變量的值 
      void swap(longint a, longint b)
      {
      	longint temp = a;
      	a = b;
      	b = temp;
      }
      
      // 歐幾里得算法求最大公約數
      longint gcd(longint a, longint b)
      {
          if (a < b)
          {
              swap(a, b);
          }
      
          while (true)
          {
              longint mod = a % b;
              if (mod == 0)
              {
                  return b;
              }
              return gcd(b, mod);
          }
      }
      
      // 求與baseNum的power次方同余的一個數
      longint powAndMod(longint baseNum, longint power, longint p)
      {
          if (power == 0)
          {
              return 1;
          }
          if (power % 2 == 1)
          {
              return (powAndMod(baseNum, power - 1, p) * baseNum) % p;
          }
          else
          {
              longint temp = (powAndMod(baseNum, power / 2, p) % p);
              return temp * temp;
          }
      }
      
      // 費馬小定理判斷是否為質數
      bool probablyPrime(longint p)
      {
          if (p == 1)
          {
              return false;
          }
          if (p == 2)
          {
              return true;
          }
          if (p % 2 == 0)
          {
              return false;
          }
          return powAndMod(2, p - 1, p) % p == 1;
      }
      
      // 隨機得到一個質數
      int getPrimeNumber(int minValue, int maxValue)
      {
          while (true)
          {
              int num = random(minValue, maxValue);
              if (probablyPrime(num))
              {
                  return num;
              }
          }
      }
      
      // 求 群Z_p^*的本原元,p為素數
      longint findGenerator(longint p)
      {
          for (longint i = 2; i < p; i++)
          {
              if (gcd(i, p) == 1)
              {
                  if (powAndMod(i, p - 1, p) % p == 1)
                  {
                      return i;
                  }
              }
          }
          return -1;
      }
      
      int main()
      {
      	srand(time(NULL));
      
      	int p = getPrimeNumber(1000000, 2000000);
          printf("選擇一個素數 p = %d\n", p);
      
          longint alpha = findGenerator(p);
      	printf("選擇本原元 α = %d\n", alpha);
      
      	longint privateKey = random(2, p - 2);
      	printf("選擇 privateKey = %d\n", privateKey);
      
      	longint publicKey = powAndMod(alpha, privateKey, p) % p;
      	printf("計算 publicKey = α^privateKey mod p = %d\n", publicKey);
      
      	printf("\n\n---加密---\n\n");
      
      	longint x = random(1, p - 1);
      	printf("選擇明文 x屬于Z_p^* = %d\n", x);
      
      	longint i = random(2, p - 2);
      	printf("選擇 i = %d\n", i);
      
      	longint ke = powAndMod(alpha, i, p) % p;
      	printf("計算臨時密鑰 ke = α^i mod p = %d\n", ke);
      
      	longint km = powAndMod(publicKey, i, p) % p;
      	printf("計算掩碼密鑰 km = publicKey^i mod p = %d\n", km);
      
      	longint y = (x % p) * (km % p);
      	printf("加密消息,得到密文 y = x * km mod p = %d\n", y);
      
      	printf("\n\n---解密---\n\n");
      
      	longint km2 = powAndMod(ke, privateKey, p) % p;
      	printf("計算掩碼密鑰 km = ke^privateKey mod p = %d\n", km);
      
      	longint x2 = (y / km2) % p;
      	printf("解密 x = y * km^{-1} mod p = %d\n", x2);
      }
      

      參考

      -《深入淺出密碼學》

      posted @ 2023-03-25 18:44  會長  閱讀(336)  評論(8)    收藏  舉報
      主站蜘蛛池模板: 国产女人喷潮视频免费| 精品午夜福利无人区乱码| 国产91精品一区二区亚洲| WWW丫丫国产成人精品| 亚洲男人天堂av在线 | 蜜芽久久人人超碰爱香蕉| 亚洲av无一区二区三区| 国产高清在线精品一区不卡| 搡老熟女老女人一区二区 | 欧美视频二区欧美影视| 极品蜜臀黄色在线观看| 中文字幕亚洲制服在线看| 伦伦影院午夜理论片| 亚洲第四色在线中文字幕| 国产午夜三级一区二区三| 精品无码久久久久国产电影| 国产在线一区二区不卡| 激情一区二区三区成人文| 99久久亚洲综合精品成人网| 中文字幕亚洲人妻一区| 狠狠亚洲狠狠欧洲2019| 精品国产成人国产在线观看| 无码人妻人妻经典| 99久久国产综合精品女同| 伊人蕉影院久亚洲高清| 人妻少妇88久久中文字幕| 91精品久久一区二区三区| 久久综合狠狠综合久久| 成人国产欧美大片一区| 亚洲成人av在线资源| 亚洲熟少妇一区二区三区| 深夜在线观看免费av| 国产乱码精品一区二区三| 景德镇市| 久久精品国产中文字幕| 乱人伦人妻中文字幕不卡| 日本一卡2卡3卡四卡精品网站| 午夜精品极品粉嫩国产尤物| 欧美成人性色一区欧美成人性色区| 欧美变态口味重另类在线视频| 国产精品午夜福利免费看|