RSA背景

在1976年以前,传统的加解密过程是:

1、A采用某种手段对数据进行加密。

2、数据传输到B的手中。

3、B逆向的实施A加密采用的步骤。

4、数据被还原。

这就是所谓的对称加密。

解密和加密的互为彼此的逆过程。加密的人必定知道解密的手段。解密的人也必定知道加密的手段。

这种加解密手段的最大特点就是对称(易于操作),但这也正是它的最大缺点。因为加密方,必须将加密规则告知解密方。

这就造成两个问题:

1、加解密规则定期就要更新,如何将加解密规则顺利的告诉对方。

2、如何安全的保存加解密规则。因为只要有一方将加解密规则泄露。那么这种加密手段就可以说被破解了。

基于此,在1976年由两位美国计算机科学家提出了一种全新的思路("Diffie-Hellman密钥交换算法"),即采用公钥-私钥对的形式进行加解密。

1、解密方生成一对密钥:公钥-私钥对。两者不存在互相推导出彼此的可能。

2、公钥随普通网络到达加密方,私钥则始终保留在解密者手中。

3、加密方使用公钥将文件转为密文

4、将密文传输给解密方。

5、解密方使用私钥将密文转为明文,完成解密。

由于公钥和私钥在逻辑上无法互相推算出彼此。这样只要私钥不被泄露,那么密文就不会解密。基于此对称加密的第一个问题的风险被解决,第二个问题的风险被缩小了一半。

受这种思路的启发,在次年,也就是1977年,由三位数学家(Rivest、Shamir 和 Adleman )联合发表了RSA算法,算法名称的来源是三位科学家的首字母的和。在随后的几十年,RSA加密算法,在密码领域中大放异彩,成为非对称加密的代表加密算法。并且随着密钥长度的不断增加,以当下的计算机运算水平,是不可能在有限的时间下,暴力破解出密钥,而攻破该算法的。

RSA加密算法的实现逻辑

在RSA算法中,需要存在五个重要的数字元素:

  p、q:这是随机选取的两个不相等质数

  n:n=p*q,也就是p和q的乘积

  φ(n):φ(n) = (p-1)(q-1) ,也就是p-1和q-1的乘积

  e:随机选取一个和φ(n)互质的正整数。并且保证 e < φ(n)

d:根据ed ≡ 1 (mod φ(n)),计算出对于φ(n)的模反元素d

ed ≡ 1 (mod φ(n)) 的含义是,ed整除φ(n)之后,余数为1。

也就是ed=k*φ(n)+1

可以看作

ed=φ(n)x+1最终利用辗转相除法(看了一下网上的推导逻辑,觉得纯数学领域了,纯记住意义不大),可以计算出一组满足的解(d,x)。

这样(n,e)是公钥,(n,d)是私钥。

由于e,d的推导是依赖的φ(n)的,而φ(n)的值来自于p、q。p、q尽管是随机取得的,但是可以由n因式分解而成。因此n的因式分解速度就成为整个解密的瓶颈。n的因式分解换言之,类似于判断n是否是质数,目前除去不断的暴力尝试,并没有好的办法。目前已知的最大分解数目的量级是10^232,占768bit位,所以一旦n突破了768位,就可以说很难破解了。(但是据说量子计算机非常适合于计算因式分解,可惜现在还是雏形)

知道了,公钥和私钥的生成后。来看下公钥私钥是如何使用的:

1、将原始信息转化为数字:无论是ascii码值,还是Unicode码,或者是其他base64转码等等,生成数字序列之后。依次循环按照下文进行加密:

公钥(n,e)、原文m

m^e ≡ c (mod n)

换言之c等于m^e除以n的余数

也就是计算出密文c

2、将密文发送给解密者,解密者依次按照下文进行还原

c^d ≡ m (mod n)公式

换言之m等于c^d除以n的余数

反向求出m即为明文

证明过程这里就忽略了,有兴趣的可以看下阮一峰写的RSA加密博客。里边的算式推理比较严谨。

此外有一点需要说明的是,在公钥加密的过程中,需要m小于n,如果在加密的过程中,发现有元素比公钥的n还要大,则需要将原文进行切割成更小的元素,然后再进行加密。

其它

另外最近流行面非常广的病毒“永恒之蓝”,始于欧洲,通过网络传播了半个世界的勒索病毒,其核心的思路就是将RSA公钥传播到本机,接着用RSA公钥加密本地文件。使本地文件不可被正常使用,进而勒索机主。待勒索成功后,只要将私钥文件再发送到本机对文件进行解密即可。思路简单,但是非常有效,难以破解,每台机器的私钥文件也几乎不会相同。

浅谈RSA加密的更多相关文章

  1. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. 浅谈RSA加密算法

    一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥  公钥:可以对外给任何人的加密和解密的密码,是公开的 私钥:通过私钥可以生成公钥,但从 ...

  3. 浅谈IAT加密原理及过程

    上一次做完代码段加密后,又接触到了新的加密方式:IAT加密 IAT加密是通过隐藏程序的导入表信息,以达到增加分析程序的难度.因为没有导入表,就无法单纯的从静态状态下分析调用了什么函数,动态调试时,也无 ...

  4. 浅谈DES加密算法

    一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...

  5. 浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

    概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很ea ...

  6. 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

    浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...

  7. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  8. 浅谈HTTPS以及Fiddler抓取HTTPS协议

    最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...

  9. [转]浅谈https\ssl\数字证书

    浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的 ...

随机推荐

  1. 生成 HTMLTestRunner 测试报告学习总结

    HTMLTestRunner 的安装与使用 HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展. 在使用之前,我们需要先安装他.下载地址:https://pyp ...

  2. vue的使用总结

    1.vue的生命周期

  3. 前端总结·基础篇·JS(四)异步请求及跨域方案

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...

  4. WPF之路一:相对路径图片显示

    由于公司项目的需要,改为WPF开发,因此需要学习WPF,遇到的第一个问题就是在显示的图片的时候,写绝对路径,图片显示没有问题,但是写相对路径的时候,发现图片无法正常显示,在网上搜了一下,得到的答案是需 ...

  5. 实现一个自己的promise

    这是小弟的一篇开篇小作,如有不当之处,请各位道友批评指正.本文将探讨Promise的实现. 一.ES6中的Promise 1.简介 据说js很早就实现了Promise,我是不知道的,我第一次接触Pro ...

  6. 一个web应用的诞生(10)--关注好友

    下面回到首页中,使用一个账户登录,你肯定已经注意到了这里的内容: 没错,现在都是写死的一些固定信息,其中分享数量很容易就可以获取,只需要修改首页模板: <p class="text-m ...

  7. Framework7首页隐藏navbar其他页面显示navbar

    Framework7首页隐藏navbar其他页面显示navbar 帮别人解决问题,自己也记录一下, 首页.navbar加.navbar-hidden, 首页.page加.no-navbar, 如果首页 ...

  8. UIDatePicker的使用

    UIDatePicker的介绍 UIDatePicker这个类的对象让用户可以在多个车轮上选择日期和时间.iPhone手机上的‘时钟’应用程序中的时间与闹铃中便使用了该控件.使用这个控件时,如果你能配 ...

  9. android开发之-数据存储Map、HashMap、Hashtable、concurenthashmap区别

    选择一个map进行软件基础数据初始化操作,要求第一次初始化后,不修改数据,可能会出现静态类被回收,然后在进行初始化操作? 1.Map :接口 /** * A {@code Map} is a data ...

  10. ASP.NET Core MVC和Visual Studio入门

    本教程将教你使用Visual Studio 2017创建 ASP.NET Core MVC web应用程序的基础知识. 安装Visual Studio 2017 和.Net Core 安装Visual ...