RSA模重复平方法

RSA模重复平方法的理解

因课设学习在RSA中使用模重复平方算法进行加快RSA加密解密,因此写这篇博客阐述自己对模重复平方法的理解:

模重复平方法

模重复平方法是一种常用于RSA算法的计算方法,在信息安全数学中有所设计,分为迭代法与非迭代法两种实现方式。 迭代法的时间复杂度为o(n^2),非迭代法的时间复杂度为o(n)

因为考虑到对于大数运算的实现难度与时间复杂度,此处只实现非迭代法。

模重复平方算法实现代码

void mod_exp(mpz_t result, const mpz_t exponent, const mpz_t base, const mpz_t n)
{
    char exp[2048 + 10];
    mpz_get_str(exp, 2, exponent); //把指数e转化为二进制并储存到字符数组exp中  

    mpz_t x, power;
    mpz_init(power);
    mpz_init_set_ui(x, 1);  // x = 1  
    mpz_mod(power, base, n); //power = base mod n  

    for (int i = strlen(exp) - 1; i > -1; i--)
    {
        if (exp[i] == '1')
        {
            mpz_mul(x, x, power);
            mpz_mod(x, x, n);   //x = x * power mod n  
        }
        mpz_mul(power, power, power);
        mpz_mod(power, power, n);  //power = power^2 mod n  
    }
    mpz_set(result, x); //返回结果  
}

模重复平方法之所以能加快RSA的速度,是因为减少了模运算的位数,对于大数而言,增强了运算的效率。
附上我自己写的利用模重复平方法的RSA加密模式,此处调用了gmp大数库。相关gmp大数库的函数不再介绍,可以自行了解。

char *mod_Encryption(const char * plain_text, const char * key_n, int key_e)/*处理明文加密*/
{
    mpz_t M, res, n, e;
    mpz_init_set_str(M, plain_text, BASE);
    mpz_init_set_str(n, key_n, BASE);
    mpz_init_set_ui(res, 0);
    mpz_init_set_ui(e, key_e);

    mod_exp(res, e, M, n);    //使用GMP中模幂计算函数

    char * result = new char[KEY_LENGTH + 10];
    mpz_get_str(result, BASE, res);

    return result;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重复方法(Montgomery modular multiplication)是一种高效的计算数下乘法的方法,它可以用于提高RSA算法等密码算法的性能。 以下是C++实现重复方法的代码: ```c++ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; typedef long long ll; ll mod; ll mul_mod(ll a, ll b) { ll res = 0; while (b) { if (b & 1) res = (res + a) % mod; a = (a << 1) % mod; b >>= 1; } return res; } ll power_mod(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = mul_mod(res, a); a = mul_mod(a, a); b >>= 1; } return res; } ll get_r() { ll r = 1; while (r < mod) r <<= 1; return r; } ll get_inv(ll a) { return power_mod(a, mod - 2); } ll montgomery_mul(ll a, ll b, ll r_inv) { ll t = a * b; ll m = t * r_inv % mod; ll u = (t + m * mod) / mod; if (u >= mod) u -= mod; return u; } ll montgomery_pow(ll a, ll b) { ll r = get_r(); ll r_inv = get_inv(r); ll t = mul_mod(a, r) % mod; ll ans = r % mod; while (b) { if (b & 1) ans = montgomery_mul(ans, t, r_inv); t = montgomery_mul(t, t, r_inv); b >>= 1; } ans = montgomery_mul(ans, 1, r_inv); return ans; } int main() { ll a, b; cin >> a >> b >> mod; cout << montgomery_pow(a, b) << endl; return 0; } ``` 其中,mul_mod函数实现了数下的乘法,power_mod函数实现了数下的快速幂,get_r函数用于计算r参数,get_inv函数计算a关于数的逆元,montgomery_mul函数实现了Montgomery乘,montgomery_pow函数实现了Montgomery指数运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值