程序员眼中的RSA算法
RSA算法是数学应用于实际的一项伟大发明,起数学过程相对而言还是比较专业的,有兴趣可以看看。
RSA算法的证明过程,详见:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
首先默认有个欧拉定理及相关的推论成立,这个要看证明过程不简单

然后看一下其加密解密的公式,可以试着推导一下:

可以看出非对称的加密解密过程,在数学上是成立的。
那么回头看它的安全性:就是要确保d不被攻破,d安全的前提是n不被成功分解。
1.能不能遍历所有的素数,来猜测p,q?
a)素数有无穷多个,google一下欧几里得的反证妙法;
b)现在再想发现新的素数很困难,数字很大,目前发现的最大质数 十进制表示有17 425 170位,够写一本书;
c)现在发现的素数有多少个呢?这是最关键的。参见:http://www.zhihu.com/question/22356265
64bit的数字 十进制大概是2*10^19,其中质数的个数约为4*10^17次方,差不多有2%的数是质数,想要遍历的话,只能呵呵了。
2.每次生成秘钥对时,都要先有两个大质数,怎么获得两个大质数呢?
a)把所有发现的质数存在本地,每次随机选两个?看看数据量就知道存储不够
b)做一个公共数据库,存储所有发现的质数,每次调库?估一眼储存,还是不够的
c)公共服务随机产生,需要的话去调用接口?不安全,这个数理论上不能在网络中传输,如果公司内网,可以考虑
d)本地随机产生?靠谱,生成复杂度高不?
3.总之要随机生成,参见:http://bindog.github.io/blog/2014/07/19/how-to-generate-big-primes/
a)素数判定方法,复杂度还好,能几乎实时
b)随机寻找的复杂度,由前面64bit的数看,有2%的数是质数,这是可以接受的,平均搜100个能得到两个,1024bit的概率有多大,不清楚
c)真随机性,上面文章中提到的,有意思的斯诺登披露的消息
4.有了两个大素数后,就是软件计算的事,长位数的大数计算,可以用croypt等库来做。网上有些直接贴的代码,学学原理可以,实际用肯定是不行。
程序员眼中的RSA算法的更多相关文章
- 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- PHP 程序员学数据结构与算法之《栈》
“要成高手,必练此功”. 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈 ...
- 应用程序员眼中的数据库管理系统:API+数据库语言
应用程序员眼中的数据库管理系统:API+数据库语言 sqlite3_open_v2 https://www.cnblogs.com/cchust/p/5121559.html
- 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?
写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...
- 一个程序员眼中的好UI
最近接到一个项目发来的UI设计图,我觉得她给的材料很专业,特此分享. 发的RAR压缩包里面有一个images目录,里面放的都是切片好的图片. 图片切片基本上都是靠近边线切的,边上留的空白很少,这样切的 ...
- 程序员眼中的UML
--克服用例图的恐惧 在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的.但是却又常常在各种媒体上看见用例图,于 ...
- 程序员眼中的Redis
Redis 是用C语言编写的内存中的数据结构存储系统,可以用来作数据库.缓存.消息中间件. 数据结构 字符串(strings):值是任何种类的字符串 散列(hashs):值是map 字典,数组+链表, ...
- 程序员训练机器学习 SVM算法分享
http://www.csdn.net/article/2012-12-28/2813275-Support-Vector-Machine 摘要:支持向量机(SVM)已经成为一种非常受欢迎的算法.本文 ...
- 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let
转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...
随机推荐
- LoadRunner 11简单使用
LoadRunner 11简单使用 开始菜单-->HP LoadRunner-->applications--->virtual user Generator 1>新建--&g ...
- 虚拟机之openVZ简单基础
OpenVZ的是免费的开源软件,基于GNU GPL协议. OpenVZ的是基于Linux的容器虚拟化. OpenVZ在一台服务器上能够创建创建多个安全隔离的Linux容器(也称为虚拟环境或的VPS), ...
- Bootstrap进阶七:LESS语法详解
1.变量 2.混合 3.带参数混合 4.模式匹配和导引表达式 5.嵌套规则 6.运算 7.Color函数 8.Math函数 9.命名空间 10.作用域 11.注释 12.Importing 13.字符 ...
- 2017-2018-1 20179202《Linux内核原理与分析》第七周作业
一 .Linux内核创建一个新进程的过程 1. 知识准备 操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理 linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状 ...
- CSUOJ 1018 Avatar
Description In the planet Pandora, Jake found an old encryption algorithm. The plaintext, key and ci ...
- 1009 Product of Polynomials (25)(25 point(s))
problem This time, you are supposed to find A*B where A and B are two polynomials. Input Specificati ...
- python 发送邮件(收到的邮件要有发送方才能回复)
Python使用SMTP(简单邮件传输协议)发送邮件 普通文本邮件 普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain ## -*- coding: UTF-8 -* ...
- [ 原创 ]学习笔记-三种向ListView中填充简单文本的方法
Android 中ListView是很重要的一块内容 掌握ListView的基本用法 对学习安卓起着举足轻重的作用 今天就介绍一下三种向ListView 填充简单文本的方法 填充其他数据类型的用法之后 ...
- python的可变与不可变数据类型
<python的可变与不可变数据类型> python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象的引用”这句话,其 ...
- TCP的三次握手与四次释放
TCP的三次握手与四次释放 一.名词解释 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给 ...