RSA加密算法简单分析

 

      

预备知识

      1)RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。

      2) 什么是“素数”?

      素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。

      3)什么是“互质数”(或“互素数”)?

      数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。

  •             判别方法主要有以下几种(不限于此):

     (1)两个质数一定是互质数。例如,2与7、13与19。

    (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。

         (3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。

              (4)相邻的两个自然数是互质数。如15与16。

              (5)相邻的两个奇数是互质数。如49与51。

              (6)大数是质数的两个数是互质数。如97与88。

              (7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。

              (8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。

      4)非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

      5) 什么是模指数运算?

      模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。模指数运算就是先做指数运算,取其结果再做模运算。如53 mod 7=125 mod 7=6。

      6)RSA安全性分析

      在公布RSA算法之后,在使用RSA密码体制和分析RSA算法发现了一系列的算法本身脆弱性及其存在的问题。

      (1)RSA公钥密码体制在加密或解密变化中涉及大量的数值计算,其加密和解密的运算时间比较长,这比数据加密标准DES的计算量开销大,在一定程度上限制了它的应用范围,以致于实际使用RSA密码体制无法用软件产品,必须用超大规模集成电路的硬件产品。

      (2)虽然提高N=P*Q的位数会大大提高RSA密码体制的安全性,但其计算量呈指数增长,以致使其实现的难度增大,实用性降低。

      (3)RSA公钥密码体制的算法完整性(指密钥控制加密或解密变换的唯一性)和安全性(指密码算法除密钥本身外,不应该存在其它可破译密码体制的可能性)沿有等进一步完善。

      (4)RSA算法面临着数学方法的进步和计算机技术飞跃发展带来的破译密码能力日趋增强的严重挑战。因子分解问题有了长跑的发展,1995年人类成功地分解了128位十进制数RSA密码算法,破译512位长的RSA指日可待。

     尽管如此,自1978年RSA算法公布以来,公开密钥密码已从理论研究进入实际应用研究阶段。RSA公开密钥密码算法在信息交换过程中使用比较广泛,安全性比较高。以当前的计算机水平,如选择1024位长的密钥(相当于300位十进制数字)就认为是无法攻破的。

      7)CAP(Cryptographic Analysis Program)是由DR. Richard Spillman专门为教学而研制的密码制作与分析工具,已经在美国的很多高校得到了广泛地使用,受到了密码学习者的普遍欢迎。

 


 

 

  • 公钥和私钥的简单理解    

                                         

初学的话对于公钥和私钥的理解是一个问题(我自己就是这样(*/ω\*),所以我们再来说一下对于公钥和私钥的一个简单的认识。我在网上找了一篇我理解了下面放出来让大家参考一下,                       原文地址:https://blog.csdn.net/tabactivity/article/details/49685319

 

 

 

 

一、公钥加密 
假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。

我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用
数字2,就是我的私钥,来解密。这样我就可以保护数据了。

我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,
只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。

  二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知
道我的公钥是1,那么这种加密有什么用处呢?

但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他
解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名

举例

比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

    1. Bob将他的公开密钥传送给Alice。
    2. Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
    3. Bob用他的私人密钥解密Alice的消息。

      上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

 


 

RSA加解密算法的原理

  首先产生密钥,过程如下:

  随机产生两个长度为K/2位的素数P 和 Q;

  计算公钥 publicKey=P*Q;(publicKey 是k位的长度)

  随机产生一个加密密钥 keyE, 2<=keyE<=Φ(n)-1其中GCD(keyE, Φ(n))=1;注:这是保证解密密钥keyE *keyD mod Φ(n)=1 有解的充要条件,Φ(n)称为n的欧拉函数,值为: Φ(n)=(P-1)*(Q-1)

  求解解密密钥keyD=keyE-1 mod (n) ,keyE-1为解密密钥keyD的逆元 ,此公式原方程为(keyE*keyD mod (n)=1)

  由此公钥,加密密钥,解密密钥全部产生。

  其次,对明文加密或对密文进行解密,过程如下:

  (1) 加密: C = MkeyE mod publicKey;其中M表示明文,C表示密文

  (2) 解密: M = CkeyD mod publicKey. 其中M表示明文,C表示密文

 

 

 


 

  RSA加密学习的简单例子(转载)

我在网上看到一篇文章如下,通过简单的举例,我更理解了RSA算法的神奇,作者的举例很棒。

在RSA中,最大值(称为max)由随机挑选的两个素数相乘而得。公钥和密钥在0和最大值之间挑选(称为pub和priv)。为了加密一个数字,让这个数字自己乘自己pub次,并确保当乘积大于最大值时能够回折(像时钟一样)。解密时,再用这个加密得到的结果自己乘自己priv次,便能退回到原始的数字。这是一件很神奇的事情!但是它确实被实现了。

为了创建RSA密钥对,首先得随机的挑选两个素数来计算出max。然后从0到max中再挑选出公钥pub,只要知道两个素数,那么就能够从pub中算出私钥。这就是为什么因式分解与破解RSA有关—对max的因式分解,可以得到两个素数,这样你便能够通过pub计算出某人的私钥,从而来解密消息。

让我们举一个更加具体的例子吧。挑选素数13和7。他们积为91,也就是max。从0到91中挑选5作为pub来加密。利用算法Extended Euclidean,输入参数:7,13,5,得到私钥是29。

三个参数(max:91,pub:5,priv:29)定义了RSA系统。这时,可以取一个数字,通过乘自己5次来加密自己,然后取这个结果乘自己29次来回到原来的数字。

让我们来加密“CLOUD”。为了能够用数学来表示一个消息,我们必须将字母转变为数字。一个常用的转换方法是UTF-8。每个字母对应一个数字,如下图:

经过编码后的“CLOUD”是67,76,79,85,68。每个数字都小于最大值91,所以我们能够各自对他们进行加密,为了简便,我们以第一个字母为例:

我们让67乘5次来加密自己:
67x67=4489=30(回折)

(回折:因为4489大于最大值max,所以我们必须回折它。我们将它除以91然后取余数,

4489=91x49+30)

30x67=2010=8

8x67=536=81

81x67=5427=58

这个结果说明67加密后为58。

为每个字母重复这个过程,我们可以加密CLOUD。

为了解密,我们需要让58乘自己29次。

58x58=3364=88

88x58=5104=8

9x58=522=67

神奇的事情发生了!我们变回了67。

RSA加密学习的简单例子 原文地址:https://blog.csdn.net/dianqu6970/article/details/76527572

 


 

 两道简单的选择题如下:

1、在密码学中,对RSA的描述是正确的是?

        

                                                                                          

  • A:RSA是秘密密钥算法和对称密钥算法
  • B:RSA是非对称密钥算法和公钥算法
  • C:RSA是秘密密钥算法和非对称密钥算法
  • D:RSA是公钥算法和对称密钥算法           

RSA就是非对称的密钥算法 ,也是公钥算法啊

2、在RSA公钥密码系统中,若A想给B发送一封邮件,并且想让B知道邮件是A发出的,则A应选用的签名密钥是A的私钥,加密时用对方的公钥,这种做法正确吗?

  • A:正确
  • B:错误

私钥用于数字签名,公钥用于验证,让B知道是A发出的当然得用A的私钥啊~

公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。

转载于:https://www.cnblogs.com/threesoil/p/9906818.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 小笔记

1、查看linux 版本 按ctrlshiftt 快捷键&#xff0c;打开终端&#xff0c;输入sudo uname --m &#xff0c;按下enter 如果显示i686,你安装了32位操作系统 如果显示 x86_64&#xff0c;你安装了64位操作系统 转载于:https://www.cnblogs.com/1995hxt/p/5436683.html

不会发布npm包?进来看看?

前言 npm(Node Package Manager)&#xff0c;一个Node的包管理器&#xff0c;平时我们常用的公共模块&#xff08;插件&#xff09;或者叫做包大多都放在上面&#xff0c;所以接下来要封装的插件&#xff0c;我们就简单称它为npm包&#xff0c;本文从就从这个简单的例子开始&am…

Nova 组件详解 - 每天5分钟玩转 OpenStack(26)

本节开始&#xff0c;我们将详细讲解 Nova 的各个子服务。 前面架构概览一节知道 Nova 有若干 nova-* 的子服务&#xff0c;下面我们将依次学习最重要的几个。今天先讨论 nova-api 和 nova-conductor。 nova-api Nova-api 是整个 Nova 组件的门户&#xff0c;所有对 Nova 的请…

12_04_Linux软件管理之四yum

2019独角兽企业重金招聘Python工程师标准>>> RPM安装&#xff1a; 二进制格式&#xff1a; 源程序--》编译--》二进制格式 有些特性是编译时选定的&#xff0c;如果编译时未选定此特性&#xff0c;将无法使用&#xff1b; rpm包的版本会落后于源码包&#xff0c;甚至…

linux 解析elf文件格式,Linux下ELF文件解析

1. windows PE文件与Linux ELF文件概述在windows中可执行文件是pe文件格式&#xff0c;Linux中可执行文件是ELF文件&#xff0c;其文件格式是ELF文件格式&#xff0c;在Linux下的ELF文件除了可执行文件(Excutable File),可重定位目标文件(RellocatableObject File)、共享目标文…

应用容器公共免费部署平台

从网上信息&#xff0c;发现了一个公共的容器部署平台 openshift.com&#xff0c;可以将我们封装好的docker镜像部署到平台上&#xff0c; 这样就不需要拥有一台云服务器了。对于测试环境非常有用。 首先当然是需要注册。这里全英文 第二&#xff0c;注册之后需要选择你想要的套…

linux 内存管理优化,Linux性能优化实战 内存篇 阅读笔记

第十五讲 基础篇&#xff1a;Linux内存是怎么工作的(2020.6.8)这一讲相关的内容正好之前看csapp的时候总结了一下&#xff0c;可以直接贴出来作为总结了。Linux的内存工作原理&#xff0c;这又是一个特别大的话题。一切向着尽量利用物理资源的方向在发展&#xff0c;在没有虚拟…

傅里叶变换与大数乘法

我们知道&#xff0c;两个 N 位数字的整数的乘法&#xff0c;如果使用常规的算法&#xff0c;时间复杂度是 O(N2)。然而&#xff0c;使用快速傅里叶变换&#xff0c;时间复杂度可以降低到 O(N logN loglogN)。 假设我们要计算以下两个 N 位数字的乘积&#xff1a; a (aN-1aN-2…

linux进程管理类命令大全,Linux进程管理类命令

一、htop命令选项-d #&#xff1a;指定延迟时间间隔&#xff1b;-u UserName&#xff1a;仅显示指定用户的进程&#xff1b;-s COLUME&#xff1a;以指定字段进行排序&#xff1b;子命令&#xff1a;l&#xff1a;显示选定的进程打开的文件列表&#xff1b;s&#xff1a;跟踪选…

android抓包工具——使用fiddler4在安卓手机抓包

Fiddler是一款非常流行并且实用的http抓包工具&#xff0c;它的原理是在本机开启了一个http的代理服务器&#xff0c;然后它会转发所有的http请求和响应&#xff0c;因此&#xff0c;它比一般的firebug或者是chrome自带的抓包工具要好用的多。不仅如此&#xff0c;它还可以支持…

ddt数据驱动

数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰ddt.ddt 3.case前加修饰ddt.data() 4.运行后用例会自动加载成三个单独的用例 5.测试结果&#xff1a; Testing started at 21:51 ...start!{username: selenium\xe7\xbe\xa4, psw: 232607095}end!start!{username…

Canvas入门06-线段与像素边界

我们知道&#xff0c;使用以下2个API可以绘制一条线段&#xff1a; moveTo(x, y) 向当前路径中增加一条子路径&#xff0c;该子路径只包含一个点&#xff0c;此为线段的起始点lineTo(x, y) 将线段的下一个点加入子路径中context.strokeStyle rgb(200, 200, 0); context.lineWi…

函数表达书-读书笔记

定义函数的方式有两种&#xff1a;一种是函数声明&#xff0c;另一种就是函数表达式。函数声明的语法如下&#xff1a; function functionName(arg0,arg1,arg2){//函数体 } 函数声明&#xff0c;有一个重要特征就是函数声明提升。也就是在执行代码之前会先读取函数声明&#xf…

vs2012新建项目产生的问题

当用vs新建web项目时遇到 只需下载一个vs2012的更新插件 http://download.microsoft.com/download/A/0/2/A02C37E0-77F7-448A-BD5C-F66AB1F78DBC/VS11-KB3002339.exe 点击安装更新即可. 转载于:https://www.cnblogs.com/GreenLeaves/p/5452073.html

zoj4062 Plants vs. Zombies 二分+模拟(贪心的思维)

题目传送门 题目大意&#xff1a;有n个植物排成一排&#xff0c;标号为1-n&#xff0c;每株植物有自己的生长速度ai&#xff0c;每对植物浇一次水&#xff0c;该株植物就长高ai&#xff0c;现在机器人从第0个格子出发&#xff0c;每次走一步&#xff0c;不能停留&#xff0c;每…

MyBatis注解模式批量insert方法

2019独角兽企业重金招聘Python工程师标准>>> 方法一:script标签方式 Insert("<script>insert into xxx (channelId,siteId) " "values " "<foreach collection\"list\" item\"item\" index\"index\&quo…

关于eclipse中文注释乱码的问题

今天打开了一个以前的android项目&#xff0c;发现中文注释都成乱码啦&#xff01;&#xff01;&#xff01; 后来在网上找了一会解决方法&#xff0c;知道了中文的编码大体是两种&#xff1a;GBK(汉字内码扩展规范)和UTF-8(8-bit Unicode Transformation Format)。 因此问题的…

python入门(5)使用文件编辑器编写代码并保存执行

python入门&#xff08;5&#xff09;使用文件编辑器编写代码并保存执行 两款文本编辑器&#xff1a; 一个是Sublime Text&#xff0c;免费使用&#xff0c;但是不付费会弹出提示框&#xff1a; 一个是Notepad&#xff0c;免费使用&#xff0c;有中文界面&#xff1a; 请注意&…

linux 批量同步,多主机目录到备份服务器批量同步脚本

为了方便同步多个主机的目录到备份服务器&#xff0c;写了如下脚本&#xff1a;#!/usr/bin/perluse strict;use File::Spec;use File::Basename;use File::Path;#设定存储路径my $storedir"/backup/";while(){chomp;my ($host,$s_path)split /\t/;my $project_namefi…