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

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

?? bn.c

?? 用VC實(shí)現(xiàn)的一個(gè)RSA加密算法
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
#include "bn.h"

#ifdef BNCORE_C

//save data from mp_int to char
void
dump_mp_int_to_char (mp_int * b, int max, char * c)
{
	char buf[512];
	int len, x, y = 0, i;

	if ((int) mp_to_unsigned_bin (b, (unsigned char *)buf) == 0)
	{

		len = (int) mp_unsigned_bin_size (b);

		for (x = 0, i = 0; x < (int)max; x++, i++)
		{
			////printf ("%02X", buf[len - 1 - x]);
			if (x < (int)(max - len))
			{
				//printf ("00");
				c[i] = (char) 0x00;
			}
			else
			{
				//printf ("%d:%02X\t", i, buf[y]);
				c[i] = (char)buf[y];
				y++;
			}
		}
	}
}

/* Known optimal configurations

 CPU                    /Compiler     /MUL CUTOFF/SQR CUTOFF
-------------------------------------------------------------
 Intel P4 Northwood     /GCC v3.4.1   /        88/       128/LTM 0.32 ;-)
 AMD Athlon64           /GCC v3.4.4   /        80/       120/LTM 0.35
 
*/

int     KARATSUBA_MUL_CUTOFF = 80,      /* Min. number of digits before Karatsuba multiplication is used. */
        KARATSUBA_SQR_CUTOFF = 120,     /* Min. number of digits before Karatsuba squaring is used. */
        
        TOOM_MUL_CUTOFF      = 350,      /* no optimal values of these are known yet so set em high */
        TOOM_SQR_CUTOFF      = 400; 
#endif


void mp_int_word_dump(mp_int *b, int max)
{
	unsigned char buf[256];
	int len,x,y=0;

	(void)mp_to_unsigned_bin(b, buf);
	len = mp_unsigned_bin_size(b);
   
	for (x = 0; x < max; x++)
	{
		//printf ("%02X", buf[len - 1 - x]);
		if (x < (max-len))
			printf ("00");
		else
		{
			printf ("%02X", (unsigned int)buf[y]);
			y++;
		}
		if ((x & 3) == 3)
		{
			printf ("\n");
		}
	}
	if ((x & 3)>0)
	{
		while ((x++ & 3)>0)
		{
			printf ("00");
		}
		printf ("\n");
	}
	else if (len == 0)
	{
		printf ("00000000\n");
	}
}



#ifdef BN_ERROR_C

static const struct {
     int code;
     char *msg;
} msgs[] = {
     { MP_OKAY, "Successful" },
     { MP_MEM,  "Out of heap" },
     { MP_VAL,  "Value out of range" }
};

/* return a char * string for a given code */
char *mp_error_to_string(int code)
{
   int x;

   /* scan the lookup table for the given message */
   for (x = 0; x < (int)(sizeof(msgs) / sizeof(msgs[0])); x++) {
       if (msgs[x].code == code) {
          return msgs[x].msg;
       }
   }

   /* generic reply for invalid code */
   return "Invalid error code";
}

#endif


#ifdef BN_FAST_MP_INVMOD_C

/* computes the modular inverse via binary extended euclidean algorithm, 
 * that is c = 1/a mod b 
 *
 * Based on slow invmod except this is optimized for the case where b is 
 * odd as per HAC Note 14.64 on pp. 610
 */
int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c)
{
  mp_int  x, y, u, v, B, D;
  int     res, neg;

  /* 2. [modified] b must be odd   */
  if (mp_iseven (b) == 1) {
    return MP_VAL;
  }

  /* init all our temps */
  if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) {
     return res;
  }

  /* x == modulus, y == value to invert */
  if ((res = mp_copy (b, &x)) != MP_OKAY) {
    goto LBL_ERR;
  }

  /* we need y = |a| */
  if ((res = mp_mod (a, b, &y)) != MP_OKAY) {
    goto LBL_ERR;
  }

  /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */
  if ((res = mp_copy (&x, &u)) != MP_OKAY) {
    goto LBL_ERR;
  }
  if ((res = mp_copy (&y, &v)) != MP_OKAY) {
    goto LBL_ERR;
  }
  mp_set (&D, 1);

top:
  /* 4.  while u is even do */
  while (mp_iseven (&u) == 1) {
    /* 4.1 u = u/2 */
    if ((res = mp_div_2 (&u, &u)) != MP_OKAY) {
      goto LBL_ERR;
    }
    /* 4.2 if B is odd then */
    if (mp_isodd (&B) == 1) {
      if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) {
        goto LBL_ERR;
      }
    }
    /* B = B/2 */
    if ((res = mp_div_2 (&B, &B)) != MP_OKAY) {
      goto LBL_ERR;
    }
  }

  /* 5.  while v is even do */
  while (mp_iseven (&v) == 1) {
    /* 5.1 v = v/2 */
    if ((res = mp_div_2 (&v, &v)) != MP_OKAY) {
      goto LBL_ERR;
    }
    /* 5.2 if D is odd then */
    if (mp_isodd (&D) == 1) {
      /* D = (D-x)/2 */
      if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) {
        goto LBL_ERR;
      }
    }
    /* D = D/2 */
    if ((res = mp_div_2 (&D, &D)) != MP_OKAY) {
      goto LBL_ERR;
    }
  }

  /* 6.  if u >= v then */
  if (mp_cmp (&u, &v) != MP_LT) {
    /* u = u - v, B = B - D */
    if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) {
      goto LBL_ERR;
    }

    if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) {
      goto LBL_ERR;
    }
  } else {
    /* v - v - u, D = D - B */
    if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) {
      goto LBL_ERR;
    }

    if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) {
      goto LBL_ERR;
    }
  }

  /* if not zero goto step 4 */
  if (mp_iszero (&u) == 0) {
    goto top;
  }

  /* now a = C, b = D, gcd == g*v */

  /* if v != 1 then there is no inverse */
  if (mp_cmp_d (&v, 1) != MP_EQ) {
    res = MP_VAL;
    goto LBL_ERR;
  }

  /* b is now the inverse */
  neg = a->sign;
  while (D.sign == MP_NEG) {
    if ((res = mp_add (&D, b, &D)) != MP_OKAY) {
      goto LBL_ERR;
    }
  }
  mp_exch (&D, c);
  c->sign = neg;
  res = MP_OKAY;

LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL);
  return res;
}
#endif


#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C

/* computes xR**-1 == x (mod N) via Montgomery Reduction
 *
 * This is an optimized implementation of montgomery_reduce
 * which uses the comba method to quickly calculate the columns of the
 * reduction.
 *
 * Based on Algorithm 14.32 on pp.601 of HAC.
*/
int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho)
{
  int     ix, res, olduse;
  mp_word W[MP_WARRAY];

  /* get old used count */
  olduse = x->used;

  /* grow a as required */
  if (x->alloc < n->used + 1) {
    if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) {
      return res;
    }
  }

  /* first we have to get the digits of the input into
   * an array of double precision words W[...]
   */
  {
    register mp_word *_W;
    register mp_digit *tmpx;

    /* alias for the W[] array */
    _W   = W;

    /* alias for the digits of  x*/
    tmpx = x->dp;

    /* copy the digits of a into W[0..a->used-1] */
    for (ix = 0; ix < x->used; ix++) {
      *_W++ = *tmpx++;
    }

    /* zero the high words of W[a->used..m->used*2] */
    for (; ix < n->used * 2 + 1; ix++) {
      *_W++ = 0;
    }
  }

  /* now we proceed to zero successive digits
   * from the least significant upwards
   */
  for (ix = 0; ix < n->used; ix++) {
    /* mu = ai * m' mod b
     *
     * We avoid a double precision multiplication (which isn't required)
     * by casting the value down to a mp_digit.  Note this requires
     * that W[ix-1] have  the carry cleared (see after the inner loop)
     */
    register mp_digit mu;
    mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK);

    /* a = a + mu * m * b**i
     *
     * This is computed in place and on the fly.  The multiplication
     * by b**i is handled by offseting which columns the results
     * are added to.
     *
     * Note the comba method normally doesn't handle carries in the
     * inner loop In this case we fix the carry from the previous
     * column since the Montgomery reduction requires digits of the
     * result (so far) [see above] to work.  This is
     * handled by fixing up one carry after the inner loop.  The
     * carry fixups are done in order so after these loops the
     * first m->used words of W[] have the carries fixed
     */
    {
      register int iy;
      register mp_digit *tmpn;
      register mp_word *_W;

      /* alias for the digits of the modulus */
      tmpn = n->dp;

      /* Alias for the columns set by an offset of ix */
      _W = W + ix;

      /* inner loop */
      for (iy = 0; iy < n->used; iy++) {
          *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++);
      }
    }

    /* now fix carry for next digit, W[ix+1] */
    W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT);
  }

  /* now we have to propagate the carries and
   * shift the words downward [all those least
   * significant digits we zeroed].
   */
  {
    register mp_digit *tmpx;
    register mp_word *_W, *_W1;

    /* nox fix rest of carries */

    /* alias for current word */
    _W1 = W + ix;

    /* alias for next word, where the carry goes */
    _W = W + ++ix;

    for (; ix <= n->used * 2 + 1; ix++) {
      *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT);
    }

    /* copy out, A = A/b**n
     *
     * The result is A/b**n but instead of converting from an
     * array of mp_word to mp_digit than calling mp_rshd
     * we just copy them in the right order
     */

    /* alias for destination word */
    tmpx = x->dp;

    /* alias for shifted double precision result */
    _W = W + n->used;

    for (ix = 0; ix < n->used + 1; ix++) {
      *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK));
    }

    /* zero oldused digits, if the input a was larger than
     * m->used+1 we'll have to clear the digits
     */
    for (; ix < olduse; ix++) {
      *tmpx++ = 0;
    }
  }

  /* set the max used and clamp */
  x->used = n->used + 1;
  mp_clamp (x);

  /* if A >= m then A = A - m */
  if (mp_cmp_mag (x, n) != MP_LT) {
    return s_mp_sub (x, n, x);
  }
  return MP_OKAY;
}
#endif


#ifdef BN_FAST_S_MP_MUL_DIGS_C

/* Fast (comba) multiplier
 *
 * This is the fast column-array [comba] multiplier.  It is 
 * designed to compute the columns of the product first 
 * then handle the carries afterwards.  This has the effect 
 * of making the nested loops that compute the columns very
 * simple and schedulable on super-scalar processors.
 *
 * This has been modified to produce a variable number of 
 * digits of output so if say only a half-product is required 
 * you don't have to compute the upper half (a feature 
 * required for fast Barrett reduction).
 *
 * Based on Algorithm 14.12 on pp.595 of HAC.
 *
 */
int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs)
{
  int     olduse, res, pa, ix, iz;
  mp_digit W[MP_WARRAY];
  register mp_word  _W;

  /* grow the destination as required */
  if (c->alloc < digs) {
    if ((res = mp_grow (c, digs)) != MP_OKAY) {
      return res;
    }
  }

  /* number of output digits to produce */
  pa = MIN(digs, a->used + b->used);

  /* clear the carry */
  _W = 0;
  for (ix = 0; ix < pa; ix++) { 
      int      tx, ty;
      int      iy;
      mp_digit *tmpx, *tmpy;

      /* get offsets into the two bignums */
      ty = MIN(b->used-1, ix);
      tx = ix - ty;

      /* setup temp aliases */
      tmpx = a->dp + tx;
      tmpy = b->dp + ty;

      /* this is the number of times the loop will iterrate, essentially 
         while (tx++ < a->used && ty-- >= 0) { ... }
       */
      iy = MIN(a->used-tx, ty+1);

      /* execute loop */
      for (iz = 0; iz < iy; ++iz) {
         _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--);

      }

      /* store term */
      W[ix] = ((mp_digit)_W) & MP_MASK;

      /* make next carry */
      _W = _W >> ((mp_word)DIGIT_BIT);
  }

  /* store final carry */
  W[ix] = (mp_digit)(_W & MP_MASK);

  /* setup dest */
  olduse  = c->used;
  c->used = pa;

  {
    register mp_digit *tmpc;
    tmpc = c->dp;
    for (ix = 0; ix < pa+1; ix++) {
      /* now extract the previous digit [below the carry] */
      *tmpc++ = W[ix];
    }

    /* clear unused digits [that existed in the old copy of c] */
    for (; ix < olduse; ix++) {
      *tmpc++ = 0;
    }
  }
  mp_clamp (c);
  return MP_OKAY;
}
#endif


#ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C

/* this is a modified version of fast_s_mul_digs that only produces
 * output digits *above* digs.  See the comments for fast_s_mul_digs
 * to see how it works.
 *
 * This is used in the Barrett reduction since for one of the multiplications
 * only the higher digits were needed.  This essentially halves the work.
 *
 * Based on Algorithm 14.12 on pp.595 of HAC.
 */
int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs)
{
  int     olduse, res, pa, ix, iz;
  mp_digit W[MP_WARRAY];
  mp_word  _W;

  /* grow the destination as required */
  pa = a->used + b->used;
  if (c->alloc < pa) {
    if ((res = mp_grow (c, pa)) != MP_OKAY) {
      return res;
    }
  }

  /* number of output digits to produce */
  pa = a->used + b->used;
  _W = 0;
  for (ix = digs; ix < pa; ix++) { 
      int      tx, ty, iy;
      mp_digit *tmpx, *tmpy;

      /* get offsets into the two bignums */
      ty = MIN(b->used-1, ix);
      tx = ix - ty;

      /* setup temp aliases */
      tmpx = a->dp + tx;
      tmpy = b->dp + ty;

      /* this is the number of times the loop will iterrate, essentially its 
         while (tx++ < a->used && ty-- >= 0) { ... }
       */
      iy = MIN(a->used-tx, ty+1);

      /* execute loop */
      for (iz = 0; iz < iy; iz++) {
         _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--);
      }

      /* store term */
      W[ix] = ((mp_digit)_W) & MP_MASK;

      /* make next carry */
      _W = _W >> ((mp_word)DIGIT_BIT);
  }
  
  /* store final carry */
  W[ix] = (mp_digit)(_W & MP_MASK);

  /* setup dest */
  olduse  = c->used;
  c->used = pa;

  {
    register mp_digit *tmpc;

    tmpc = c->dp + digs;
    for (ix = digs; ix <= pa; ix++) {
      /* now extract the previous digit [below the carry] */
      *tmpc++ = W[ix];
    }

    /* clear unused digits [that existed in the old copy of c] */
    for (; ix < olduse; ix++) {
      *tmpc++ = 0;
    }
  }
  mp_clamp (c);
  return MP_OKAY;
}
#endif


#ifdef BN_FAST_S_MP_SQR_C

/* the jist of squaring...

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国女主播成人在线观看| 欧美妇女性影城| 成人免费视频视频| 国产美女精品人人做人人爽| 久久99蜜桃精品| 九九国产精品视频| 国产在线一区二区综合免费视频| 奇米一区二区三区| 久久99精品久久久久久国产越南| 麻豆精品在线视频| 国产精品影视在线观看| 成人丝袜18视频在线观看| 99视频在线精品| 日本道在线观看一区二区| 欧美日韩中文另类| 91精品国产综合久久久久久久久久| 日韩限制级电影在线观看| 日韩精品一区二区三区中文不卡 | 欧美一区二区三区播放老司机| 67194成人在线观看| 日韩免费电影网站| 久久九九国产精品| 亚洲精品国产无天堂网2021| 亚洲一区视频在线观看视频| 日韩精品电影一区亚洲| 国产资源精品在线观看| 波多野结衣91| 欧美日韩精品一区二区三区四区| 91麻豆精品国产自产在线| 久久久国产精华| 亚洲欧美另类小说视频| 婷婷久久综合九色综合伊人色| 蜜桃精品在线观看| 成人黄色小视频在线观看| 欧美日韩情趣电影| 久久久天堂av| 亚洲乱码日产精品bd| 丝袜亚洲精品中文字幕一区| 国产精品性做久久久久久| 色菇凉天天综合网| 欧美成人video| 亚洲色图制服丝袜| 另类小说欧美激情| 91免费精品国自产拍在线不卡| 91精品国产综合久久久久久久久久 | 久久久99久久精品欧美| 国产精品久久久久婷婷二区次| 午夜精品一区二区三区电影天堂 | 日韩不卡一区二区三区| 国产成人av电影免费在线观看| 欧美亚洲动漫另类| 久久精品日韩一区二区三区| 亚洲国产cao| 粉嫩av一区二区三区粉嫩| 欧美日韩精品福利| 国产精品久久久久影院| 美女在线视频一区| 色美美综合视频| 久久久不卡影院| 午夜视频在线观看一区| 成人一区二区视频| 欧美一区二区三区白人| 一区二区三区在线免费观看| 国产美女精品在线| 欧美一区二区在线免费观看| 亚洲欧美日韩国产成人精品影院 | 欧美手机在线视频| 中文字幕av不卡| 免费观看91视频大全| 日本道在线观看一区二区| 国产人成亚洲第一网站在线播放| 日韩福利视频导航| 色婷婷综合中文久久一本| 国产清纯在线一区二区www| 日韩精品亚洲专区| 日本高清不卡一区| 国产精品久久久久久久久久久免费看 | 午夜精品福利一区二区三区av | 日韩美女视频在线| 性做久久久久久免费观看| 91一区二区在线| 国产精品美女久久久久久久久久久| 精品一区二区免费在线观看| 在线成人av网站| 亚洲综合色噜噜狠狠| 99久久免费国产| 中文字幕第一区| 大白屁股一区二区视频| 久久精品男人天堂av| 国产一区二区在线观看免费| 日韩一区二区麻豆国产| 天天操天天干天天综合网| 在线观看免费亚洲| 亚洲免费观看高清完整版在线观看 | 亚洲午夜激情av| 欧美图区在线视频| 一区二区三区四区亚洲| 91麻豆高清视频| 日韩毛片精品高清免费| 99国产精品99久久久久久| 亚洲色欲色欲www| 91蝌蚪porny成人天涯| 有码一区二区三区| 在线观看视频一区二区| 亚洲小少妇裸体bbw| 欧美日韩久久久| 日韩激情视频网站| 51精品久久久久久久蜜臀| 奇米777欧美一区二区| 欧美一级高清片| 久久成人免费网| 久久久无码精品亚洲日韩按摩| 国产成人一区在线| 国产精品久久国产精麻豆99网站 | 欧美成人三级电影在线| 国产综合久久久久久久久久久久| 国产日韩欧美精品在线| av中文字幕一区| 亚洲在线视频网站| 欧美精品777| 国产一区二区三区免费看| 国产精品三级久久久久三级| 91视频xxxx| 偷拍日韩校园综合在线| 亚洲精品在线网站| caoporn国产精品| 亚洲丰满少妇videoshd| 欧美一级日韩免费不卡| 国产美女精品在线| 最新热久久免费视频| 91国在线观看| 日本三级亚洲精品| 欧美国产精品中文字幕| 在线精品国精品国产尤物884a| 日韩—二三区免费观看av| 国产三级精品在线| 在线一区二区观看| 另类欧美日韩国产在线| **网站欧美大片在线观看| 51精品秘密在线观看| 成人理论电影网| 五月婷婷激情综合| 亚洲国产高清aⅴ视频| 欧美三级日韩三级| 国产乱人伦偷精品视频不卡| 一区二区三区在线免费观看| 精品剧情在线观看| 日本久久电影网| 国产精品一区二区视频| 亚洲香蕉伊在人在线观| 秋霞av亚洲一区二区三| 久久久久久综合| 欧美日韩一区三区| 国产精品99久久久久久久女警| 亚洲视频一区在线| 欧美午夜一区二区| 国产精品99久久久久久似苏梦涵| 亚洲一区二区精品久久av| 国产无一区二区| 欧美一区日韩一区| 99精品1区2区| 国产一区二区在线影院| 亚洲成人黄色小说| 成人免费高清在线| 国产精品一二三四五| 亚洲国产aⅴ成人精品无吗| 国产日产欧美一区二区视频| 欧美日韩色一区| 97se狠狠狠综合亚洲狠狠| 国产美女精品人人做人人爽| 天堂va蜜桃一区二区三区 | 亚洲卡通欧美制服中文| 欧美mv和日韩mv的网站| 欧美三级日韩三级| 91麻豆国产精品久久| 丁香桃色午夜亚洲一区二区三区| 三级久久三级久久久| 一区二区三区在线视频免费 | 一区二区理论电影在线观看| 欧美激情在线观看视频免费| 日韩欧美美女一区二区三区| 欧美午夜精品一区二区蜜桃| 91蜜桃在线免费视频| 成人中文字幕电影| 久久狠狠亚洲综合| 日本视频中文字幕一区二区三区| 夜夜精品视频一区二区| 亚洲色图第一区| 亚洲桃色在线一区| 国产精品理论片| 国产欧美日韩三级| 久久久99精品久久| 久久品道一品道久久精品| 欧美成人精品高清在线播放| 欧美一卡二卡在线| 91精品国产91久久综合桃花| 欧美午夜片在线看| 欧美日韩精品一区二区| 欧美无人高清视频在线观看| 欧美天堂一区二区三区|