⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 big_ops3.cpp

📁 含有多种公开密钥算法、多种块加密、多种数据流加密、多种HASH函数、多种CheckSum校验、多种MAC校验等几十种加密算法的程序
💻 CPP
字号:
/************************************************** BigInt Binary Operators Source File            ** (C) 1999-2002 The Botan Project                **************************************************/#include <botan/bigint.h>#include <botan/numthry.h>#include <botan/mp_core.h>#include <iostream>#include <iomanip>namespace Botan {/************************************************** Addition Operator                              **************************************************/BigInt operator+(const BigInt& x, const BigInt& y)   {   if((x.sign() == y.sign()))      {      BigInt z(x.sign(), std::max(x.sig_words(), y.sig_words()) + 1);      bigint_add3(z.get_reg(), x.data(), x.sig_words(),                               y.data(), y.sig_words());      return z;      }   else if(x.is_positive())      return (x - y.abs());   else      return (y - x.abs());   }/************************************************** Subtraction Operator                           **************************************************/BigInt operator-(const BigInt& x, const BigInt& y)   {   s32bit relative_size = bigint_cmp(x.data(), x.sig_words(),                                     y.data(), y.sig_words());   if(relative_size == 0 && (x.sign() == y.sign())) return BigInt::zero();   if(relative_size == 0 && (x.sign() != y.sign())) return (x << 1);   BigInt z(Positive, std::max(x.sig_words(), y.sig_words()) + 1);   if(relative_size == -1)      {      if(x.sign() == y.sign())         bigint_sub3(z.get_reg(), y.data(), y.sig_words(),                                  x.data(), x.sig_words());      else         bigint_add3(z.get_reg(), x.data(), x.sig_words(),                                  y.data(), y.sig_words());      z.set_sign(y.reverse_sign());      }   if(relative_size == 1)      {      if(x.sign() == y.sign())         bigint_sub3(z.get_reg(), x.data(), x.sig_words(),                                  y.data(), y.sig_words());      else         bigint_add3(z.get_reg(), x.data(), x.sig_words(),                                  y.data(), y.sig_words());      z.set_sign(x.sign());      }   return z;   }/************************************************** Multiplication Operator                        **************************************************/BigInt operator*(const BigInt& x, const BigInt& y)   {   if(x.is_zero() || y.is_zero())      return BigInt::zero();   Sign sign = Positive;   if(x.sign() != y.sign())      sign = Negative;   const u32bit x_sw = x.sig_words();   const u32bit y_sw = y.sig_words();   if(x_sw == 1 || y_sw == 1)      {      BigInt z(sign, x_sw + y_sw);      if(x_sw == 1)         bigint_linmul3(z.get_reg(), y.data(), y_sw, x.word_at(0));      else         bigint_linmul3(z.get_reg(), x.data(), x_sw, y.word_at(0));      return z;      }   BigInt z(sign, x.size() + y.size());   bigint_mul3(z.get_reg(), z.size(),               x.data(), x.size(), x_sw,               y.data(), y.size(), y_sw);   return z;   }/************************************************** Division Operator                              **************************************************/BigInt operator/(const BigInt& x, const BigInt& y)   {   BigInt q, r;   divide(x, y, q, r);   return q;   }/************************************************** Modulo Operator                                **************************************************/BigInt operator%(const BigInt& n, const BigInt& mod)   {   if(mod.is_zero())      throw BigInt::DivideByZero();   if(mod.is_negative())      throw Invalid_Argument("BigInt::operator%: modulus must be > 0");   BigInt q, r;   divide(n, mod, q, r);   return r;   }/************************************************** Modulo Operator                                **************************************************/word operator%(const BigInt& n, word mod)   {   if(mod == 0)      throw BigInt::DivideByZero();   if(power_of_2(mod))      return (n.word_at(0) & (mod - 1));   BigInt q, r;   divide(n, mod, q, r);   return r.word_at(0);   }/************************************************** Left Shift Operator                            **************************************************/BigInt operator<<(const BigInt& x, u32bit shift)   {   if(shift == 0) return x;   const u32bit shift_words = shift / MP_WORD_BITS,                shift_bits  = shift % MP_WORD_BITS;   BigInt y(x.sign(), x.sig_words() + shift_words + (shift_bits ? 1 : 0));   bigint_shl2(y.get_reg(), x.data(), x.sig_words(), shift_words, shift_bits);   return y;   }/************************************************** Right Shift Operator                           **************************************************/BigInt operator>>(const BigInt& x, u32bit shift)   {   if(shift == 0) return x;   if(x.bits() <= shift)      return BigInt::zero();   const u32bit shift_words = shift / MP_WORD_BITS,                shift_bits  = shift % MP_WORD_BITS;   BigInt y(x.sign(), x.sig_words() - shift_words);   bigint_shr2(y.get_reg(), x.data(), x.sig_words(), shift_words, shift_bits);   return y;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -