RSA模幂运算

1. 实验内容

按照平方乘算法和模重复平方法,分别计算am mod n

2. RSA介绍

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

3. 模幂运算

模指数运算的快速算法

例如求x16,直接计算的话需做15次乘法。然而如果重复对每个部分结果做平方运算即求x,x2,x4,x8,x16则只需4次乘法。

RSA算法模幂运算

  • 求am可如下进行,其中a,m是正整数:
  • 将m表示为二进制形式bk bk-1…b0,即
  • m=bk2k+bk-12k-1+…+b12+b0
  • 因此bk=0 而 bk-i=1或者bk-i=0

am=ab0·(a2)b1·(a4)b2···(a2k-1)bk-1·(a2k)bk

RSA算法模幂运算

  • 将m表示为二进制形式bk bk-1…b0,即
  • m=bk2k+bk-12k-1+…+b12+b0
  • 因此bk=0 而 bk-1=1或者bk-i=0

am=((···(((abk)2·abk-1)2·abk-2)2···ab1)2·ab0)

4. RSA算法

例:求a19
19=1×24+0×23+0×22+1×21+1×20
所以
a19=((((a1)2a0)2a0)2a1)2a1

5. 代码实现

#include <stdio.h>int main()
{int a, m, n, a1, m1, n1, a2, m2, n2;int i, j, cnt, quotient, tmp, s1 = 1, s2 = 1;int mm[20];printf("请输入数字(a, m, n):");scanf("%d%d%d", &a, &m, &n);a1 = a2 = a;m1 = m2 = m;n1 = n2 = n;quotient = m1;for (i = 0; quotient != 0; i++){mm[i] = quotient % 2;quotient = quotient / 2;}j = i;printf("模重复平方根算法:\n");for (i = 0; i < j; i++){if (mm[i] == 1){s1 = (s1 * a1) % n1;}a1 = (a1 * a1) % n1;printf("i = %d, s = %d, a = %d\n", mm[i], s1, a1);}printf("最终结果为:s = %d\n\n\n", s1);for (i = 0; i < j / 2 ; i++){tmp = mm[i];mm[i] = mm[j-i-1];mm[j-i-1] = tmp;}cnt = j;printf("平方乘算法:\n");for (i = 0; i < j; i++){s2 = (s2 * s2) % n2;printf("%d, ",s2);if (mm[i] == 1){s2 = (s2 * a) % n2;}printf("i = %d, b%d = %d, s = %d\n", cnt-1, cnt-1, mm[i], s2);cnt--;}printf("最终结果为:s = %d\n", s2);return 0;
}

【密码学】C 语言实现 RSA 模幂运算相关推荐

  1. Modular_exponentiation模幂运算

    https://en.wikipedia.org/wiki/Modular_exponentiation 蒙哥马利(Montgomery)幂模运算是快速计算a^b%k的一种算法,是RSA加密算法的核心 ...

  2. C++modular exponentiation模幂运算的实现算法(附完整源码)

    C++modular exponentiation模幂运算的实现算法 C++modular exponentiation模幂运算的实现算法完整源码(定义,实现,main函数测试) C++modular ...

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

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

  4. 如何高效进行模乘、模幂运算?——蒙哥马利算法(Montgomery Algorithm)从入门到精通

    蒙哥马利算法(Montgomery Algorithm)从入门到精通 ​ 加密算法中,模运算(包括模乘.模幂运算)是难以避免的,如何高效地进行模运算,是提高算法效率的一个关键. 直观的想法 ​ 在数学 ...

  5. 幂运算 数组_Super Pow:如何高效进行模幂运算

    点击上方蓝字设为星标 东哥带你搞定算法~ 今天来聊一道与数学运算有关的算法题目,LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数. int superPow(int ...

  6. RSA算法的Python实现(模幂运算——原始算法)

    参考文章: RSA的基本原理就不做赘述,详细的可以去查一查,主要介绍使用python来计算RSA算法 设p.q为质数 n = p*q fn = (p-1)*(q-1) 要满足: 1 < e &l ...

  7. B00007 快速模幂运算的两个C语言程序

    代码来自维基百科的Modular arithmetic. 这两段代码都不是大整数计算的程序,是2进制64整数的计算程序,数据不能大于2进制63位.两段代码分别如下: uint64_t mul_mod( ...

  8. python语言实现rsa公钥密码算法_python实现RSA算法

    文章最后更新时间为:2018年12月26日 23:07:29 RSA是一种公钥密码算法,其影响力我就不多说了,算法原理网上多的是,看了几篇,还是觉得阮一峰写的好懂. 要想实现RSA,其关键在于大数运算 ...

  9. 51Nod-1013 3的幂的和【快速模幂+逆元】

    1013 3的幂的和 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 Input 输入 ...

最新文章

  1. PyTorch ResNet 测试
  2. 有关Java中json字符串与map的转换使用
  3. 学计算机的误解,让人误解的六大专业
  4. c语言 单词变复数_一些复数运算的C语言实现
  5. Web安全渗透测试之信息搜集篇(上)
  6. android高德marker添加点击,高德地图上添加marker,给每一个marker添加点击事件。...
  7. 信息学奥赛一本通(1044:判断是否为两位数)
  8. kafka发送消息至指定分区
  9. 前端的深拷贝和浅拷贝_javascript中的深拷贝和浅拷贝?
  10. Extjs grid禁用头部点击三角下拉菜单
  11. java连接hsql数据库_hsql数据库使用详解(入门)及快速使用
  12. PLC编程语言你知道多少
  13. 5wpa_supplicant程序 --详解
  14. 凌晨三点的程序员,别让你的辛苦被辜负
  15. 小程序引入阿里矢量图
  16. 解密滴滴黑科技:超低功耗桔视ADAS落地实践
  17. PSM倾向匹配详细步骤和程序
  18. java图形界面计算器_java图形界面 计算器实现
  19. ComingChat进入Web3.0世界的门户,未来社交新趋势!
  20. 【BZOJ2754】【SCOI2012】喵星球上的点名(后缀数组)

热门文章

  1. 【机器学习】机器学习的基本概念/术语2
  2. CHAPTER 5 文件共享 - FTP/FTPS/SFTP
  3. 常用的python 开源 IDE
  4. 微信摇一摇插件ios_iOS摇一摇手机,播放微信摇一摇音效
  5. SLAM学习资源免费分享-转载
  6. 《java并发编程的艺术》阅读笔记总结
  7. Linux--增加用户、添加用户组
  8. VMware 14 Pro 永久许可证激活密钥
  9. 什么是对象、什么是面对对象?
  10. PPC气箱脉冲除尘器