RSA是目前使用最广泛的公钥密码体制之一。它是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法的安全性基于RSA问题的困难性,也就是基于大整数因子分解的困难性上。但是RSA问题不会比因子分解问题更加困难,也就是说,在没有解决因子分解问题的情况下可能解决RSA问题,因此RSA算法并不是完全基于大整数因子分解的困难性上的。
**

1.欧拉函数

什么是欧拉函数
  欧拉函数是小于x的整数中与x互素的数的个数,一般用φ(x)表示。特殊的,φ(1)=1.
如何计算欧拉函数
  通式:φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…*(1-1/pn),其中p1, p2……pn为n的所有素因数,n是不为0的整数.
欧拉函数的一些性质  
① N是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)

② 除了N=2,φ(N)都是偶数.

③ 小于N且与N互质的所有数的和是φ(n)*n/2。

④ 欧拉函数是积性函数——若m,n互质,φ(m*n)=φ(m)*φ(n)。

⑤ 当N为奇数时,φ(2*N)=φ(N)

⑥ 若N是质数p的k次幂,φ(N)=pk-p(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟N互质。

⑦ 当N是质数时,φ(N) = N-1

欧拉定理

欧拉定理是指:如果两个正整数a和n互素,则n的欧拉函数φ(n)可以让下面的式子成立:

即a的φ(n)次方减去1,可以被n整除. 比如,3和4互质,φ(4)=2,(3^2-1)/4=2. 当a为正整数,n为素数且a不能被n整除时,则有           a^(n-1) ≡ 1 (mod n)这就是费马小定理.

模反元素

如果两个正整数a和n互素,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1. 这时,b就叫做a对模数n的模反元素.

欧拉定理可以用来证明模反元素必然存在,如下图,可以看到:a的 φ(n)-1 次方,就是a对模数n的模反元素.

RSA算法

5.1 密钥的生成过程

  1. 随意选择两个大的素数p和q,p不等于q,计算n = pq.
  2. 根据欧拉函数的性质3,求得r=φ(n)=φ( p)φ(q)=(p-1)(q-1).
  3. 选择一个小于r的整数e,且e与r互素;并求得e关于r的模反元素,命名为d.(模反元素存在,当且仅当e与r互质; 求d令ed≡1(mod r))
  4. 将p和q的记录销毁
      其中(n,e)是公钥,(n,d)是私钥. 例如:
  5. A随机选两个不相等的质数61和53,并计算两数的积n=61*53=3233,n的长度就是密钥长度。3233的二进制是110010100001,一共12位,
    所以这个密钥就是12位. 实际应用中,RSA密钥一般是1024位,重要的场合是2048位.
  6. 计算n的欧拉函数; φ(n)=(p-1)(q-1)=60*52=3120.
  7. A在1到3120上随机选择了一个随机数e=17,与3120互素.
  8. 计算e对φ(n)的模反元素d,即时,ed-1=kφ(n)。
    即使求解:17x+3120y=1.用扩展欧几里得算法求解。可以算出一组解(x,y)=(2753,-15),即d=2753. 公钥(3233, 17),私钥(3233,2753)
      至此完成计算.
    5.2 RSA的可靠性    
    在RSA私钥和公钥生成的过程中,共出现过p,q,n,φ(N),e,d,其中n,e组成公钥,其他的都不是公开的,一旦d泄露,就等于私钥泄露;  那么能不能根据n,e推导出d呢?    
    1.ed ≡ 1(mod φ(n)) 只有知道e和φ(n),才能算出d
  9. φ(n)=(p-1)(q-1) 只有知道p和q,才能算出φ(n)
  10. n=pq,只有将n分解才能算出p和q  所以,只有将n素因数分解,才能算出d; 也就意味着私钥破译. 但是,大整数的质因数分解是非常困难的. 所以理论上来说,如果我们找到  了快速对大整数进行质因数分解的方法,那么RSA加密也就没什么安全性可言了;遗憾的是,目前数学上并没有找到这样快速的质因数分解方法.
    5.3 RSA的加密过程    
    假设A要向B发送加密信息m,他就要用B的公钥(n,e)对m进行加密,但m必须是整数(字符串可以取ascii值或unicode值),且m必须小  于n. 所谓加密就是计算下式的c:    m^e ≡ c (mod n)  假设m=65,B的公钥(3233,17),所以等式如下:    65^17≡2790(mod 3233)  所以c等于2790,A就把2790发给B.5.4 RSA的解密过程    B收到A发来的2790后,就用自己的私钥(3233,2755)进行解密      c^d ≡ m (mod n)  也就是c的d次方除以n的余数就是m      2790^2753 ≡ 65 (mod 3233)  因此得到原文65.

C语言代码

**

#include <stdio.h>
int candp(int a,int b,int c)
{ int r=1;b=b+1;while(b!=1){r=r*a;r=r%c;b--;}return r;
}
main()
{int p,q,e,d,m,n,t,c,r;char s;printf("请输入大素数p和q ");scanf("%d%d",&p,&q);n=p*q;printf("n=%3d\n",n);t=(p-1)*(q-1);printf("t=%3d\n",t);printf("请输入 e: ");scanf("%d",&e);if(e<1||e>t){printf("输入的e不合规,请重新输入 ");scanf("%d",&e);}d=1;while(((e*d)%t)!=1)   d++;printf("计算d的结果为 %d\n",d);printf("加密请输入 1\n");printf("解密请输入 2\n");scanf("%d",&r);switch(r){case 1: printf("输入明文m: "); /*输入要加密的明文数字*/scanf("%d",&m);c=candp(m,e,n);printf("密文为 %d\n",c);break;case 2: printf("输入密文 c: "); /*输入要解密的密文数字*/scanf("%d",&c);m=candp(c,d,n);printf("明文为 %d\n",m);break;}getchar();
}

rsa公钥密码和签名含C语言代码相关推荐

  1. C语言算三角形外心坐标,三角形外心坐标公式(含C语言代码).pdf

    三角形外心坐标公式(含C语言代码).pdf (1页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 =2 − + − − −2 − + − ...

  2. ecc签名体制c语言代码大全,ECC算法C语言实现-Go语言中文社区

    密码学实验:ECC算法实现 1.实验内容 2.运行结果: 1.椭圆曲线上的点集 2.椭圆曲线生成元以及对应的阶 3.加解密算法 代码如下: /* (1)编程计算该椭圆曲线上所有在有限域GF(89)上的 ...

  3. c语言变量名s_i使其随i变化,动态规划I(含细c语言代码).ppt

    动态规划I(含细c语言代码) 数字三角形 问题描述 问题描述 2.解题思路 3.参考程序 I 3.参考程序 I 程序I分析 程序分析 4.参考程序 II 4.参考程序 II 程序II分析 5.参考程序 ...

  4. rsa2048加密算法c语言代码,rsa加密算法c语言代码

    如何用C语言实现RSA算法? 上学期交的作业,已通过老师在运行时间上的测试 #include #include unsigned long prime1,prime2,ee; unsigned lon ...

  5. c语言错误 xef代表什么,单片机C语言代码手册 含100多个经典C程序

    1 单片机单片机 C 语言代码手册语言代码手册 1 LED 灯灯 点亮一个点亮一个 LED include void main while 1 P0 0 x01 P2 0 x7d 流水灯闪烁流水灯闪烁 ...

  6. 特殊矩阵的压缩存储(详细版 通俗易懂 含c语言稀疏矩阵十字链表代码 )

    前言 此文章是本人第一篇博客,目的在于巩固过去所学的知识,同时可能会给大家带来一丝丝帮助,但由于没有经验加上本人能力极其有限,文章中可能存在不足之处,还请读者能够指正(`・ω・´). 这篇文章首先会介 ...

  7. matlab中的addemup是什么,毕业论文-rsa密码体制的设计及matlab语言下的实现

    四川理工学院毕业论文RSA密码体制的设计及MATLAB语言下的实现学生XXX学号06121020230专业数学与应用数学班级20062指导教师张金山四川理工学院理学院二O一O年六月摘要RSA算法是一个 ...

  8. iOS应用签名原理--数字签名?代码签名?双层代码签名?

    数字签名 数字签名(又称公钥数字签名.电子签章等)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个 ...

  9. 中小型研发团队架构落地实践18篇,含案例、代码

    1 写在前面 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速迭代以验证商业模式, ...

最新文章

  1. Elasticsearch 知识点目录
  2. NodeJs中process.cwd()与__dirname的区别
  3. VTK:高亮选择动画用法实战
  4. 树莓派小车(远程控制、PWM变速、超声波自动避障)
  5. ubuntu下面的java一键运行脚本
  6. 【Tricks】半监督深度学习训练和实现小Tricks
  7. 别怕,“卷积”其实很简单
  8. PCI设备扫描和资源分配
  9. 模板引擎工作原理_zuma致:新手SEO须知搜索引擎工作原理
  10. 营业执照识别项目记录--CTPN使用
  11. python日历模块_日历模块---calendar
  12. 土建中级工程师考试用书电子版_建筑工程中级职称考试试卷教学教材
  13. 如何用代码实现发送qq邮件(详细代码)
  14. 计算机网络手写笔记图片,一键收藏!清华学子这样记笔记!
  15. 牵丝戏计算机谱,急求牵丝戏计算器谱完整版!!!
  16. QDateTime时间
  17. 安装实例中出现的ORA-27123和ORA-12532的错误
  18. 网络封包分析工具Charles(接口抓取)
  19. 可视化项目管理只需一个甘特图
  20. java 3d 配置_Java 3D简介及安装运行

热门文章

  1. 穿过镜头看历史:斯皮尔伯格的二战情结
  2. 80后男宣言:娶妻不娶房奴女!
  3. L1-6 吃火锅 (15分)
  4. Coursera 英文字幕实时翻译脚本
  5. VsCode SSH远程连接服务器【内网穿透公网连接】
  6. try块的三种组合方式
  7. Java中对泛型的理解及应用
  8. 删除文件时提示需要**权限, 通过命令行修改文件/目录的所有者和权限
  9. 气质油然而生,散发无尽魅力的女表推荐
  10. IPad实现Mac的分屏功能