亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? elgamal.c

?? 應用密碼學這本書的源代碼
?? C
字號:
/*
  Author:  Pate Williams (c) 1997

  ElGamal public-key encryption. See "Handbook of
  Applied Cryptography" by Alfred J. Menezes et al
  8.4 Section pages 294 - 296.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "\freelip\lip.h"

#define BITS_PER_CHAR 8l

int get_bit(char *buffer, long number)
{
  long bit = number % BITS_PER_CHAR;
  long byte = number / BITS_PER_CHAR;

  return (buffer[byte] >> bit) & 1;
}

void set_bit(char *buffer, int value, long number)
{
  long bit = number % BITS_PER_CHAR;
  long byte = number / BITS_PER_CHAR;
  long mask;

  if (value == 1)
    buffer[byte] |= (char) (1 << bit);
  else {
    mask = 1 << bit;
    buffer[byte] &= (char) ~mask;
  }
}

void bits_to_verylong(char *bits, long number, verylong *za)
{
  long i;
  verylong zb = 0;

  zintoz(bits[0] - '0', za);
  for (i = 1; i < number; i++) {
    zlshift(*za, 1l, &zb);
    zsadd(zb, bits[i] - '0', za);
  }
  zfree(&zb);
}

void verylong_to_bits(char *bits, long *number, verylong za)
{
  long i;
  verylong zb = 0, zc = 0;

  *number = z2log(za);
  zcopy(za, &zb);
  for (i = 0; i < *number; i++) {
    zlowbits(zb, 1l, &zc);
    bits[i] = (char) ((zc[1] & 1) + '0');
    zrshift(zb, 1l, &zc);
    zcopy(zc, &zb);
  }
  bits[*number] = 0;
  strrev(bits);
  zfree(&zb);
  zfree(&zc);
}

long OddRandom(long bit_length)
{
  long i, mask = 1, n;

  bit_length--;
  for (i = 1; i <= bit_length; i++)
    mask |= 1 << i;
  if (bit_length < 16)
    n = (1 << bit_length) | rand();
  else
    n = (1 << bit_length) | (rand() << 16) | rand();
  n &= mask;
  if ((n & 1) == 0) n++;
  return n;
}

void PROVABLE_PRIME(long k, verylong *zn)
{
  double c, r, s;
  int success;
  long B, m, n, p, sqrtn;
  verylong zI = 0, zR = 0, za = 0, zb = 0, zc = 0;
  verylong zd = 0, zk = 0, zl = 0, zq = 0, zu = 0;

  srand(time(NULL));
  zrstarts(time(NULL));
  if (k <= 20) {
    do {
      n = OddRandom(k);
      sqrtn = sqrt(n);
      zpstart2();
      do p = zpnext(); while (n % p != 0 && p < sqrtn);
    } while (p < sqrtn);
    zintoz(n, zn);
  }
  else {
    c = 0.1;
    m = 20;
    B = c * k * k;
    if (k > 2 * m)
      do {
        s = rand() / (double) RAND_MAX;
        r = pow(2.0, s - 1.0);
      } while (k - r * k <= m);
    else
      r = 0.5;
    PROVABLE_PRIME(r * k + 1, &zq);
    zone(&za);
    zlshift(za, k - 1, &zk);
    zcopy(zq, &za);
    zlshift(za, 1l, &zl);
    zdiv(zk, zl, &zI, &za);
    zsadd(zI, 1l, &zl);
    zlshift(zI, 1l, &zu);
    success = 0;
    while (!success) {
      do zrandomb(zu, &zR); while (zcompare(zR, zl) < 0);
      zmul(zR, zq, &za);
      zlshift(za, 1l, &zb);
      zsadd(zb, 1l, zn);
      zcopy(zR, &za);
      zlshift(za, 1l, &zR);
      zpstart2();
      p = zpnext();
      while (zsmod(*zn, p) != 0 && p < B) p = zpnext();
      if (p >= B) {
        zcopy(*zn, &zc);
        zsadd(zc, - 2l, &zb);
        do
          zrandomb(*zn, &za);
        while (zscompare(za, 2l) < 0 || zcompare(za, zb) > 0);
        zsadd(*zn, - 1l, &zc);
        zexpmod(za, zc, *zn, &zb);
        if (zscompare(zb, 1l) == 0) {
          zexpmod(za, zR, *zn, &zb);
          zcopy(zb, &zd);
          zsadd(zd, - 1l, &zb);
          zgcd(zb, *zn, &zd);
          success = zscompare(zd, 1l) == 0;
        }
      }
    }
  }
  zfree(&zI);
  zfree(&zR);
  zfree(&za);
  zfree(&zb);
  zfree(&zc);
  zfree(&zd);
  zfree(&zk);
  zfree(&zl);
  zfree(&zq);
  zfree(&zu);
}

void generator(long k, verylong zn, verylong *za,
               verylong *zp)
/* find a generator a of the cyclic group of order n
   where the factorization of n is known */
{
  long i;
  verylong zb = 0, zc = 0, zr = 0;

  L:
    zrandomb(zn, za);
    i = 0;
    M:
      zdiv(zn, zp[i], &zc, &zr);
      zexpmod(*za, zc, zn, &zb);
      if (zscompare(zb, 1l) == 0) goto L;
      i++;
      if (i < k) goto M;
  zfree(&zb);
  zfree(&zc);
  zfree(&zr);
}

void ElGamal_gen_keys(long length, verylong *za,
                      verylong *zaa, verylong *zc,
                      verylong *zp)
{
  long k = length - 1;
  verylong zb = 0, zn = 0, zq = 0, zr[2];

  zr[0] = zr[1] = 0;
  zrstarts(time(NULL));
  do {
    PROVABLE_PRIME(k, &zq);
    zlshift(zq, 1l, &zb);
    zsadd(zb, 1l, zp);
  } while (!zprobprime(*zp, 18l));
  zsadd(*zp, - 1l, &zn);
  k = 2;
  zintoz(2l, &zr[0]);
  zcopy(zq, &zr[1]);
  generator(k, zn, za, zr);
  do zrandomb(zn, zc); while (zscompare(*zc, 0l) == 0);
  zexpmod(*za, *zc, *zp, zaa);
  zfree(&zb);
  zfree(&zn);
  zfree(&zq);
  zfree(&zr[0]);
  zfree(&zr[1]);
}

void ElGamal_encryption(char *inp, char *out, long inp_len,
                        long *left, long *out_len,
                        verylong za, verylong zaa,
                        verylong zp)
/* inp_len is the length of the input buffer in bytes
   out_len is the length of the output buffer in bits */
{
  long out_bit_length = z2log(zp), inp_bit_length = out_bit_length - 1;
  long b = inp_len << 3;
  long blocks = b / inp_bit_length;
  long inp_i = 0, out_i = 0, i, j, k;
  char *bits = calloc(out_bit_length + 1, sizeof(char));
  verylong zc = 0, zd = 0, zg = 0, zk = 0, zm = 0, zn = 0;

  *left = b % inp_bit_length;
  zsadd(zp, - 1l, &zn);
  for (i = 0; i < blocks; i++) {
    for (j = 0; j < inp_bit_length; j++)
      bits[j] = (char) (get_bit(inp, inp_i++) + '0');
    bits_to_verylong(bits, inp_bit_length, &zm);
    do zrandomb(zn, &zk); while(zscompare(zk, 0l) == 0);
    zexpmod(za, zk, zp, &zg);
    zexpmod(zaa, zk, zp, &zc);
    zmulmod(zm, zc, zp, &zd);
    verylong_to_bits(bits, &k, zg);
    for (j = 0; j < out_bit_length - k; j++)
      set_bit(out, 0, out_i++);
    for (j = 0; j < k; j++)
      set_bit(out, bits[j] - '0', out_i++);
    verylong_to_bits(bits, &k, zd);
    for (j = 0; j < out_bit_length - k; j++)
      set_bit(out, 0, out_i++);
    for (j = 0; j < k; j++)
      set_bit(out, bits[j] - '0', out_i++);
  }
  if (*left > 0) {
    for (j = 0; j < *left; j++)
      bits[j] = (char) (get_bit(inp, inp_i++) + '0');
    bits_to_verylong(bits, *left, &zm);
    do zrandomb(zn, &zk); while(zscompare(zk, 0l) == 0);
    zexpmod(za, zk, zp, &zg);
    zexpmod(zaa, zk, zp, &zc);
    zmulmod(zm, zc, zp, &zd);
    verylong_to_bits(bits, &k, zg);
    for (j = 0; j < out_bit_length - k; j++)
      set_bit(out, 0, out_i++);
    for (j = 0; j < k; j++)
      set_bit(out, bits[j] - '0', out_i++);
    verylong_to_bits(bits, &k, zd);
    for (j = 0; j < out_bit_length - k; j++)
      set_bit(out, 0, out_i++);
    for (j = 0; j < k; j++)
      set_bit(out, bits[j] - '0', out_i++);
  }
  *out_len = out_i;
  zfree(&zc);
  zfree(&zd);
  zfree(&zg);
  zfree(&zk);
  zfree(&zm);
  zfree(&zn);
}

void ElGamal_decryption(char *inp, char *out, long inp_len,
                        long left, long *out_len,
                        verylong zc, verylong zp)
/* inp_len is the length of the input buffer in bits
   out_len is the length of the output buffer in bytes */
{
  long inp_bit_length = z2log(zp), out_bit_length = inp_bit_length - 1;
  long blocks = inp_len / (2 * inp_bit_length);
  long inp_i = 0, out_i = 0, i, j, jmax, k;
  char *bits = calloc(inp_bit_length + 1, sizeof(char));
  verylong zd = 0, ze = 0, zg = 0, zm = 0, zn = 0;

  zsadd(zp, - 1l, &zn);
  zsub(zn, zc, &ze);
  for (i = 0; i < blocks; i++) {
    for (j = 0; j < inp_bit_length; j++)
      bits[j] = (char) (get_bit(inp, inp_i++) + '0');
    bits_to_verylong(bits, inp_bit_length, &zg);
    for (j = 0; j < inp_bit_length; j++)
      bits[j] = (char) (get_bit(inp, inp_i++) + '0');
    bits_to_verylong(bits, inp_bit_length, &zd);
    zexpmod(zg, ze, zp, &zn);
    zmulmod(zn, zd, zp, &zm);
    verylong_to_bits(bits, &k, zm);
    if (i == blocks - 1 && left != 0) jmax = left;
    else jmax = out_bit_length;
    for (j = 0; j < jmax - k; j++)
      set_bit(out, 0, out_i++);
    for (j = 0; j < k; j++)
      set_bit(out, bits[j] - '0', out_i++);
  }
  *out_len = out_i >> 3;
  zfree(&zd);
  zfree(&ze);
  zfree(&zg);
  zfree(&zm);
  zfree(&zn);
}

int main(void)
{
  char alphabet[32] = "abcdefghijklmnopqrstuvwxyz";
  char inp[4096] = {0}, out[4096]= {0};
  long i, inp_len = 260, left, out_len;
  verylong za = 0, zaa = 0, zc = 0, zp = 0;

  for (i = 0; i < 10l; i++)
    strcpy(inp + 26l * i, alphabet);
  ElGamal_gen_keys(128l, &za, &zaa, &zc, &zp);
  ElGamal_encryption(inp, out, inp_len, &left, &out_len, za, zaa, zp);
  ElGamal_decryption(out, inp, out_len, left, &inp_len, zc, zp);
  inp[inp_len] = 0;
  printf("%s\n", inp);
  zfree(&za);
  zfree(&zc);
  zfree(&zp);
  zfree(&zaa);
  return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清成人在线观看| 亚洲一区二区三区四区的| 欧美一级艳片视频免费观看| 在线观看不卡视频| 在线欧美一区二区| av一区二区不卡| 成人18精品视频| 成人在线一区二区三区| 91在线视频免费91| 色综合久久天天| 欧美性猛片aaaaaaa做受| 欧美日韩一区不卡| 欧美精品aⅴ在线视频| 欧美一区二区三区在线观看视频| 欧美亚洲高清一区二区三区不卡| 欧美唯美清纯偷拍| 日韩亚洲欧美高清| 国产免费成人在线视频| 亚洲欧美国产毛片在线| 亚洲一二三四久久| 免费久久99精品国产| 久久99久久久欧美国产| 成人高清视频在线观看| 一本到不卡免费一区二区| 欧美综合欧美视频| 精品国产乱码久久久久久闺蜜 | 亚洲电影在线免费观看| 亚洲成av人片在线| 国产麻豆精品95视频| 成人av免费在线播放| 欧美三级韩国三级日本三斤| 91麻豆精品国产自产在线观看一区 | 国产iv一区二区三区| 色噜噜狠狠一区二区三区果冻| 欧美日本视频在线| 国产丝袜欧美中文另类| 亚洲第一久久影院| 国产精品亚洲人在线观看| 色噜噜偷拍精品综合在线| 日韩欧美资源站| 亚洲日本一区二区三区| 毛片av中文字幕一区二区| www.成人网.com| 欧美一级高清片| |精品福利一区二区三区| 日韩 欧美一区二区三区| 成人动漫视频在线| 精品国内二区三区| 亚洲福利国产精品| 成人av综合在线| 精品国产人成亚洲区| 亚洲成av人片在www色猫咪| 国产69精品久久久久777| 在线综合视频播放| 一区二区三区精品在线观看| 韩国成人精品a∨在线观看| 欧美三级中文字幕在线观看| 中文字幕av资源一区| 乱一区二区av| 欧美三级蜜桃2在线观看| 亚洲日本在线看| 国产高清在线观看免费不卡| 欧美精品在线观看一区二区| 一区二区三区不卡视频在线观看 | 国产亚洲制服色| 欧美日韩精品免费观看视频| 蜜桃视频在线一区| 91网址在线看| 国产午夜精品久久久久久久| 亚洲高清视频中文字幕| 色综合亚洲欧洲| 国产精品久久网站| 国产 欧美在线| 国产人久久人人人人爽| 国产精品一区二区久久不卡| 精品美女在线观看| 久久电影网站中文字幕| 精品少妇一区二区三区免费观看 | 久久国产人妖系列| 欧美日韩精品一区二区三区四区| 亚洲永久免费视频| 精品视频在线看| 日一区二区三区| 欧美一区二区三区啪啪| 蜜臀av一区二区| 久久久美女艺术照精彩视频福利播放| 久久国产精品99久久人人澡| 日韩欧美另类在线| 国产精品自拍在线| 国产精品黄色在线观看| 91日韩精品一区| 亚洲va国产天堂va久久en| 欧美巨大另类极品videosbest | 国产白丝网站精品污在线入口| 欧美国产精品久久| 91在线视频18| 午夜国产精品一区| 日韩欧美成人一区二区| 成人性生交大片免费看中文网站 | 色综合av在线| 亚洲国产一区二区a毛片| 4438亚洲最大| 国产不卡视频在线观看| 亚洲精品美国一| 日韩精品自拍偷拍| 成人国产精品免费网站| 香蕉久久一区二区不卡无毒影院| 欧美一区二区三区视频在线观看| 韩国一区二区在线观看| 日韩一区在线播放| 日韩网站在线看片你懂的| av一区二区久久| 久久精品国产99| 一区二区三区成人| 久久精品免视看| 欧美日韩一区二区三区四区 | 蜜桃精品在线观看| 成人欧美一区二区三区视频网页| 欧美男男青年gay1069videost| 国产伦精品一区二区三区免费 | 久久精品二区亚洲w码| 亚洲欧美日韩系列| www成人在线观看| 欧美日韩国产三级| 91亚洲男人天堂| 国产美女娇喘av呻吟久久| 亚洲国产视频直播| 欧美日韩在线不卡| 日韩久久一区二区| 日韩欧美在线观看一区二区三区| 国产成人精品综合在线观看| 日韩美女视频一区二区| 久久久久久麻豆| 欧美日韩亚洲国产综合| 高清国产一区二区| 日本aⅴ亚洲精品中文乱码| 亚洲黄色录像片| 欧美国产亚洲另类动漫| 欧美老人xxxx18| jiyouzz国产精品久久| 国产精品538一区二区在线| 亚洲一区二区欧美| 国产精品成人一区二区艾草| 欧美精品一区男女天堂| 欧美电影免费观看高清完整版在线 | 欧美一级一区二区| 不卡高清视频专区| 成人国产精品免费观看动漫 | 午夜免费久久看| 亚洲一二三四久久| 亚洲女子a中天字幕| 国产色一区二区| 91精品国产综合久久久蜜臀图片| 日本久久电影网| 成人手机在线视频| 国产一区二区在线观看视频| 午夜免费久久看| 亚洲国产精品尤物yw在线观看| 亚洲国产精品麻豆| 亚洲日本中文字幕区| 国产精品国产三级国产专播品爱网| 日韩视频永久免费| 欧美日韩精品电影| 日韩欧美国产系列| 91麻豆精品91久久久久久清纯 | 91精品国产麻豆| 精品欧美一区二区久久| 欧美日韩国产小视频在线观看| 欧美日韩成人综合天天影院| 欧美午夜不卡在线观看免费| 欧美视频中文一区二区三区在线观看 | 亚洲精品日韩综合观看成人91| 国产精品久久久久永久免费观看 | 91久久精品午夜一区二区| 一本色道a无线码一区v| 91视频在线看| 91亚洲男人天堂| 欧美日韩一区二区三区在线看| 欧美亚一区二区| 欧美精品一区在线观看| 久久精品一区蜜桃臀影院| 久久久精品黄色| ㊣最新国产の精品bt伙计久久| 一区二区三区日韩精品视频| 亚洲午夜一区二区| 日本美女一区二区三区视频| 黄色小说综合网站| 久久国产尿小便嘘嘘尿| 91尤物视频在线观看| 欧美日本在线播放| 久久在线观看免费| 日韩欧美高清dvd碟片| 亚洲欧美在线视频| 视频一区欧美精品| 免费在线观看成人| 国产mv日韩mv欧美| 日韩欧美色综合网站| **性色生活片久久毛片| 午夜私人影院久久久久| 国产一区二区不卡在线|