模重复平方计算法(C语言版本)

\quadRSARSARSA算法是197819781978年由R.RivestR.RivestR.Rivest、A.ShamirA.ShamirA.Shamir和L.AdlemanL.AdlemanL.Adleman提出的一种用数论构造的、也是迄今为止理论上最为成熟完善的公钥密码密码体制,该体制已得到广泛的应用。

算法描述

1.密钥的产生

(1)选两个保密的大素数ppp和qqq;

(2)计算n=p∗qn=p*qn=p∗q,ψ(n)=(p−1)(q−1)\psi(n)=(p-1)(q-1)ψ(n)=(p−1)(q−1), 其中ψ(n)\psi(n)ψ(n)是nnn的欧拉函数;

(3)选一整数eee,满足1<e<ψ(n)1<e<\psi(n)1<e<ψ(n),且gcd(ψ(n),e)=1gcd(\psi(n),e)=1gcd(ψ(n),e)=1;

(4)计算ddd满足:
de≡1modψ(n)de\equiv1mod\psi(n) de≡1modψ(n)
即ddd是在eee在模ψ(n)\psi(n)ψ(n)下的乘法逆元;

(5)以{eee,nnn}为公钥,{ddd,nnn}为公钥.
2.加密

\quad加密时首先将明文比特串分组,使得每个分组对应的十进制小数小于nnn, 对每个明文分组mmm做加密运算:
c≡memodψ(n)c\equiv m^emod\psi(n) c≡memodψ(n)
3.解密

对密文分组的解密运算为:
m≡cdmodψ(n)m\equiv c^dmod\psi(n) m≡cdmodψ(n)

算法中的优化

\quadRSARSARSA的加密和解密过程得为求一个整数的整数次幂,在取模。在这个运算过程中如果简单的运用递归,那么中间结果非常大,有可能超出计算机所允许的整数取值范围。然而如果利用模的运算性质:
(a∗b)mod(n)≡[(a)mod(n)∗bmod(n)]modn.(a*b)mod(n)\equiv [(a)mod(n)*bmod(n)]modn. (a∗b)mod(n)≡[(a)mod(n)∗bmod(n)]modn.
我们就可以大大减小中间运算结果。

模重复平方计算法原理

\quad考虑问题,对大整数m和大整数n计算:
bn(modm)b^n(modm) bn(modm)
例如:
12996227mod3790912996^{227}mod37909 12996227mod37909
不难看出若利用递归计算,那么这过程中的中间值将是惊人的,所以我们考虑使用模重复平方计算法。
1.现将n写成二进制,即:
n=n0+n12+…+nk−12k−1,ni∈[0,1],i=0,1,…,k−1n=n_0+n_12+ \ldots +n_{k-1}2^{k-1},n_i\in[0,1],i=0,1,\ldots,k-1 n=n0​+n1​2+…+nk−1​2k−1,ni​∈[0,1],i=0,1,…,k−1
那么,式:
bn(modm)b^n(modm) bn(modm)
的计算可以归纳为:
bn≡bn0⏟a0(b2⏟b1)n1⏟a1…(b2k−2⏟bk−2)nk−2⏟ak−2(b2k−1⏟bk−1)nk−1⏟ak−1(modm)b^n\equiv \underbrace{\underbrace{\underbrace{\underbrace {b^{n_0}} _ {a_0}(\underbrace {b^2}_ {b_1})^{n_1}}_{a_1} \ldots (\underbrace {b^{2^{k-2}}}_ {b_k-2})^{n_k-2}} _{a_k-2} (\underbrace {b^{2^{k-1}}}_ {b_k-1})^{n_k-1}}_{a_k-1}(modm) bn≡ak​−1ak​−2a1​a0​bn0​​​(b1​b2​​)n1​​​…(bk​−2b2k−2​​)nk​−2​​(bk​−1b2k−1​​)nk​−1​​(modm)
这样我们就可以仅进行至多2[log2n]2[log_2n]2[log2​n]次乘法便结束计算。

模重复平方计算法实现(C语言)

我们这里便展示上述的示例:

// 模重复平方计算法.cpp: 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include"conio.h"
#include"stdlib.h"
#include"string.h"
int MRSM(long long b, long long n,long long m)//模重复平方计算法,其中b为底数,n为指数,m为模数
{long long M=1;char str[1024];_itoa_s(n, str, 2);//将指数n转化成二进制int count = strlen(str);for (int i = count-1; i >= 0; i--)//进入循环,利用模运算规律进行求解.{if (str[i] == '1')M=((M *= b)%m);elseM = M;b = ((b * b)%m);}return M%m;
}int main()
{printf("%d\n", MRSM(12996, 227,37909));_getch();return 0;
}

运行结果展示:(注:经过仅不到2秒便得出结果,初步达到了简化计算的目的.)

模重复平方计算法的C实现相关推荐

  1. 信息安全数学基础——模重复平方计算法(两种方法实现C+JAVA)

    你好,我是罡罡同学! 代码谱第一页忘掉心上人,最后一页...... 前言 正在学习信息安全数学基础这门课程. 编程实现模重复平方计算法. 先介绍一下模重复平方算法 一.模重复平方算法 图片来自大学MO ...

  2. C++实现模重复平方计算法

    #include<iostream> using namespace std;int main() {cout << "请输入底数:" << e ...

  3. 模幂运算问题,使用朴素算法和重复-平方算法(快速幂+C#计算程序运行时间)

    1.什么是模幂运算问题 给出a, k, mod 计算ak(%mod)a^k (\%mod)ak(%mod)的值 k是一个非常大的正整数(超过1e7) 附,一个可以提交的地方: leetcode 372 ...

  4. php中输出每一层的平方数,打印本页 - 求复矩阵的每一个元素的模的平方

    标题: 求复矩阵的每一个元素的模的平方 作者: LibAndLab 于 九月 07, 2018, 12:58:41 pm 假如有一个复矩阵H,大小为1024*2048,要求abs(H).^2,下面是我 ...

  5. 矩阵的模的平方matlab,matlab求矩阵、向量的模

    求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...

  6. 向量范数与矩阵范数矩阵模的平方-函数和几何以及映射的关系-数学

    https://zhuanlan.zhihu.com/p/30485749 https://blog.csdn.net/yb536/article/details/40900239 https://b ...

  7. 计算机数学基础教案,信息安全数学基础教案(禹勇)

    教 师 教 案 ( 2009-2010 学年第 一 学期 ) 课 程 名 称:信息安全数学基础 授 课 学 时:40学时 授 课 班 级:信息安全专业,-60班 任 课 教 师:禹勇 教 师 职 称: ...

  8. 公钥密码学中的简单数学基础

    公钥密码学中的简单数学基础 本文基于<深入浅出密码学>第六章以及Paillier中使用到的相关数学知识进行总结,并计划不断更新 逆元 介绍 注意:不是所有的元素都存在乘法逆元 假设a∈Zm ...

  9. Solovay-Stassen素性检验的C语言实现

    Solovay-Stassen素性检验的C语言实现 我在这里用C语言实现了Solovay-Stassen概率素性检验,代码如下: // Solovay-Stassen素性检验.cpp: 定义控制台应用 ...

  10. 2019-2020南邮《信息安全数学基础》期末考试回忆

    复习时发现网络上相关资料真的是太少了-复习起来真的太费劲了-所以想至少写一点造福后人吧- 填空 顺序乱了 φ(840)\varphi(840)φ(840) 7777^{7^7}777的个位 (1182 ...

最新文章

  1. 程序员崩溃的10个瞬间
  2. 移动端1px像素的设置?
  3. 做接口测试最重要的知识点
  4. [转]Visual Studio 2010帮助文件MSDN安装说明
  5. 新学期的一些安排 | 以及一些小建议
  6. Python_Mix*OS模块,序列化模块种的json,pickle
  7. Java开发经典面试题分享,建议收藏
  8. 开源中国 2014 年源创会年度计划
  9. (收集)vim72 .vimrc的一个样本
  10. linux系统下网络连接不上的问题
  11. DSB2017第一名代码尝试运行(记录自用)(四)
  12. 自学python要多久-怎么自学python,大概要多久?
  13. FireDac 组件说明二
  14. CSS/HTML/JS实现图片轮播
  15. java关键字有system吗_java 关键字
  16. nexus下载及上传jar包
  17. html为知笔记模板,新建笔记模板二次开发
  18. 2021-04-17
  19. 项目成败的关键要素:有效沟通
  20. 【Angular/TS】一文弄懂安全导航操作符(?.)、非空断言操作符/可选链(?.) 、空值合并运算符

热门文章

  1. Linux小项目-广告机项目设计
  2. Eclipse官方下载最新版
  3. Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用
  4. 宿舍校园网路由器配置原理及指南
  5. Unicode中文和特殊字符的编码范围 及部分正则
  6. 网易校招测试岗位2018
  7. Gitbub 常用命令
  8. UltraCompare v21.00分析
  9. 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
  10. windows下格式化内存卡