第三章 如何改进和优化RSA算法

这章呢,我想谈谈在实际应用出现的问题和理解。
由于近期要开始各种忙了,所以写完这章后我短时间内也不打算出什么资料了=- =(反正平时就没有出资料的习惯。)
在讲第一章的时候我提到过两个函数在真实应用时舍弃掉的,为何这样说呢?
因为在实际应用中,生成了数据规模N和两把密钥E与D即可进行RSA算法的运作,在应用RSA时只需要一个a^b%c幂模运算函数,所以优化点集中在了数据类型和数据加密解密速度上。

注意RSA函数有个特点,就是根据源数据产生的密文一定是属于n内的,因为一旦被加密数据大于n就会导致的密文不唯一(当同余式的任意整数k不唯一),基于此性质可知,这函数还是一个一对一函数,也就是说RSA的工作原理其实就是洗牌(你也可以拿RSA来充当不重复随机数生成函数来用哦~)。
那么我们就来谈谈优化吧,首先确定好待加密的单一数据规模,也就是加密的位长,用C语言的话来说就是,是一次加密一个字节(char)呢还是四个字节(int)呢?这取决于算法的执行环境,这个类型的选择可能会出现在单片机的开发上,像51单片机这样的默认处理都是一字节,从优化的角度上来讲就应该使用对应处理速度的数据类型,也就是每次加密char数据,而在一般的intel家的都是32位以上的了,如果还在用char的处理方案估计要急死还有浪费(本来就可以处理更多但你非要拿四分之一出来处理),所以对于32位机的就应该直接应用int了。
但是,不知道还有同学有没有注意到一个问题,就是a^b%c幂模运算函数设计的问题,对于常规的算法就是对a^b的结果执行mod运算。可是我们知道a^b是极其容易超出本身的最大值的,那么这将会无法算出正确的值而导致数据错乱,解决办法有更换更大的数据类型或采用不定长的数据类型(大数运算库gmp之类的),还有改进算法,不过今天我就不讲前面两种方案了,直接说第三种方案吧,第三种方案其实就藏在我的另外一篇日志中,据此点击传送门~
至此我们来说说RSA的安全性吧,它主要体现在哪里呢?然后又将如何改进安全性呢?
如果我们要改进一个密码学算法,就要从如何破解它去展开思考,要破解RSA算法,我们可以从数据规模N与两把密匙E和D下手。
首先确保RSA算法的所有值都不被外人得知,假如我从数据规模N下手,由于网上大部分代码(人)喜欢用两个质数p和q来产生数据规模N(特殊的欧拉函数性质),这将导致N与φ(N)满足N=pq,φ(N)=(p-1)(q-1)。那么我们要做的事情就是对N进行因式分解,分解成两个质数的乘积,在计算机看来这可是个苦力活啊,因为普通的计算机处理问题和大部分普通人一样,最擅长的就是蛮力解决问题,比如要算6可以分解成哪几对两个数乘积则有(1,6)(2,3),这对你来说很简单吧,现在换65536呢,你能写出有多少对乘积?当然,换成量子计算机的并行运算这种压根不是问题,而RSA的难度仅仅在这里,而这个在现在的计算机看来还真的没什么难度。所以我们要破解数据规模N可以利用素数表来得到为两素数乘积为N的所有可能素数对,然后再运用筛法来获取满足E与φ(N)互质的乘法逆元D,最后再通过一下中间人攻击(在A和B之间监听后转发的家伙)记录A与B两人的RSA密文通信,只要将所拥有的记录解密出来后的数据没有重合则可以依据数据量来表示破解程度,但一旦出现重合现象,则退回上层换密钥E重新产生密钥D再尝试,如果还不行就只能换产生数据规模N的两个质数p和q,所以针对这种的破解是相当轻松的。
为了提高破解难度我们应该不要使用特殊欧拉函数来生成数据规模,用标准欧拉函数生成的数据规模虽然也是可以被筛法试出来的,但是它意味着第三方破解者的试除法的可能性数据更加庞大,不仅是围绕素数表而是围绕所有整数的可能。不过就现在而言,有个应用在量子计算机上的秀尔算法已经无视了这种问题,遇到这样的被攻破也是正常,难道我们就这样放弃了吗,不,我们还可以针对中间人攻击的密文再加密,因为只要没有可用的密文源你根本没法展开破解,那么从这点上我们可以利用其他方法来混淆密文,比如使用AES等这类对称密钥加密算法,这类算法仅依靠一个私有的公共key来进行数据的加解密。当然,一旦key被外人知道了基本就GG了,可是当做到这样的时候,外界的破解重心就转移到了AES上,相当于给RSA上了一堵墙。只是日防夜防,家贼难防。对于直接反编译代码(逆向工程)拆开源程序的静态数据的破解(直接获取密钥E和数据规模N)我们又该怎么防呢?
这个问题我将会在以后尝试讲解 Diffie-Hellman算法以及离散对数知识的运用(ECC问题),他们有一个很神奇的特点就是你可以用任意的数据生成指定唯一的数据,缺点就是需要大数库的支持,因为这样多对一的映射会导致要加密数据规模N必然得有大于当前数据规模N更多的数,ECC算法如今已经逐步取代RSA开始在一些国家机关使用了,在我国有个叫国家商用密码管理办公室的网站,并在国家密码管理局发布了SM2椭圆曲线公钥密码算法文件和推荐曲线参数,也就是ECC算法文件,啊,跑题了,就当给大家科普一些密码学方面的资料吧= -=。
至此所有章节已经讲完,不知道有没有同学觉得有点意思或者说有收获呢(代码),希望有更多科班出身的同学多多关注后端,因为前端那些是给路人和培训出来的人玩的。如果想在编程方面比别人有更多优势,依鄙人之见,可以从操作系统,编译原理,算法设计,数学建模,密码学,机器学习,计算机视觉,计算机网络,高并发集群设计,数学函数实现等方面下手,望各位同学获取优异成绩之余也能多多动手编程,最最最后附上一句话:要想人前装逼,必先人后受苦。

实现 RSA 算法之改进和优化(第三章)(老物)的更多相关文章

  1. 实现 RSA 算法之 C 语言实现(第二章)(老物)

    第二章 如何实现应用RSA算法 趁着白天在自家店里的闲暇时间来写写第二章了,假设记住了第一章的各种定理之后,我们又该如何实现RSA密码的加密解密呢?也懒得废话了,直接进入正题吧. 先回顾几个知识点: ...

  2. 实现 RSA 算法之基础公式证明(第一章)(老物)

    写这篇日志是拖了很久的事情,以前说要写些算法相关的文章给想学信息安全学(简称信安),密码学的同学提供些入门资料,毕竟这种知识教师上课也不会细讲太多(纯理论偏重),更不用说理解和应用了,说到RSA公钥( ...

  3. 说说 HeapSort 堆排序思想,以及个人优化方案。(老物)

    听说你要排上亿个数据之 HeapSort ? 前言 : 来来来,今天我们来说说一个用来排大量数据所用的基础比较排序吧~ 注:阅读本文学习新技能的前置要求为:了解什么是二叉树及其数组性质,如果未达到要求 ...

  4. Linux性能优化 第三章 性能工具:系统内存

    3.1内存性能统计信息 3.1.1 内存子系统和性能 和CPU相比,内存的读写速度都大大落后于CPU.为了弥补这个差距,通常CPU会采用高速缓存的机制(高cache). 3.1.2 内存子系统(虚拟存 ...

  5. 优化 Karatsuba 乘法(老物)

    虽然写好了我自己用的a*启发函数但还是有些不尽人意,如果通过数学分析确定不出问题可以工作了的话应该就会发出来了 // Karatsuba 递归式距离推导 // h(x) = f(x) * g(x):/ ...

  6. RSA算法原理——(3)RSA加解密过程及公式论证

    上期(RSA简介及基础数论知识)为大家介绍了:互质.欧拉函数.欧拉定理.模反元素 这四个数论的知识点,而这四个知识点是理解RSA加密算法的基石,忘了的同学可以快速的回顾一遍. 一.目前常见加密算法简介 ...

  7. RSA算法原理——(2)RSA简介及基础数论知识

    上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...

  8. RSA算法原理——(1)目前常见加密算法简介

      艾伦·麦席森·图灵在二战期间主要负责破译德国人的密码系统Enigma,破解密码需要大量的计算,图灵深知工欲善其事必先利其器的道理,于是一台叫作CO-LOSSUS的计算机在1943年被研制出来,后来 ...

  9. RSA算法优化

    RSA算法优化 大数乘法 模乗优化 剩余定理(孙子定理) RSA加解密 python的RSA计算优化 #-*- coding: utf-8 -*- ''' /********************* ...

随机推荐

  1. React 开发中面临的九个重要抉择

    抉择系列:在技术开发的过程中我们会面临着各种各样的抉择,我们在不同情境下该如何选择恰当的技术,这是本系列文章想要解决的问题. 在 React 开发的过程中我们常常会遇到一些抉择,下面我将选取其中一些个 ...

  2. Spring Boot使用阿里云证书启用HTTPS

    1.到阿里云下载证书页面下载证书 2.根据页面内容,可以使用2种证书:PFX JKS 把对应证书放到src/main/resources目录下 在application.properties文件中加入 ...

  3. 整合spring之后,struts2里面的自定义拦截器的invocation.invoke()总是返回input

    这个真的是整死我了,还好看见了一篇博客提示了我, 解决方法: 在spring的bean配置中我没有设置action的作用域为prototype,也就是多例的,如果不设置则就会是默认的singleton ...

  4. C++入门经典-例2.11-流输出小数控制

    1:代码如下: // 2.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  5. php面向对象 练习

    实例一:求一个圆环的面积,大圆半径:10    小圆半径:5 造一个圆的类: class Yuan { public $r; function __construct($r) //半径初始化 { $t ...

  6. leetcode 82 删除排序列表中的重复元素II

    与83类似,不过需要注意去除连续的重复片段的情况,如2 2 3 3这种情况,以及[1,1]这种情况下最终的cur为NULL,因此不能再令cur=cur->next; /** * Definiti ...

  7. php URL处理函数

    parse_url()    basename()    pathinfo()    dirname() 用法 parse_url() 是一计算机函数,功能是解析一个 URL 并返回一个关联数组,包含 ...

  8. CentOS 系统安装 nodejs 及相关配置

    概述 今天我在我的 AWS EC2 服务器上安装了 nodejs.没想到竟然这么麻烦,比在 windows 和 mac 上麻烦多了.所以我把心得记录下来,供以后开发时参考,相信对其他人也有用. 参考资 ...

  9. Java学习之==>JDBC

    一.概述 官方解释: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的 Java API,可以为多种关系型数据库提供统一访问,它由一组用 ...

  10. Web09_MySQL多表&JDBC

    使用JDBC发送insert语句完成单表[添加]操作 使用JDBC发送update语句完成单表[更新]操作 使用JDBC发送delete语句完成单表[删除]操作 使用JDBC发送select语句完成单 ...