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算法的更多相关文章

  1. 程序员眼中的 SQL Server-执行计划教会我如何创建索引?

    先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...

  2. PHP 程序员学数据结构与算法之《栈》

    “要成高手,必练此功”.   要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈 ...

  3. 应用程序员眼中的数据库管理系统:API+数据库语言

    应用程序员眼中的数据库管理系统:API+数据库语言 sqlite3_open_v2 https://www.cnblogs.com/cchust/p/5121559.html

  4. 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?

    写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...

  5. 一个程序员眼中的好UI

    最近接到一个项目发来的UI设计图,我觉得她给的材料很专业,特此分享. 发的RAR压缩包里面有一个images目录,里面放的都是切片好的图片. 图片切片基本上都是靠近边线切的,边上留的空白很少,这样切的 ...

  6. 程序员眼中的UML

    --克服用例图的恐惧 在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的.但是却又常常在各种媒体上看见用例图,于 ...

  7. 程序员眼中的Redis

    Redis 是用C语言编写的内存中的数据结构存储系统,可以用来作数据库.缓存.消息中间件. 数据结构 字符串(strings):值是任何种类的字符串 散列(hashs):值是map 字典,数组+链表, ...

  8. 程序员训练机器学习 SVM算法分享

    http://www.csdn.net/article/2012-12-28/2813275-Support-Vector-Machine 摘要:支持向量机(SVM)已经成为一种非常受欢迎的算法.本文 ...

  9. 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let

    转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...

随机推荐

  1. LoadRunner 11简单使用

    LoadRunner 11简单使用 开始菜单-->HP LoadRunner-->applications--->virtual user Generator 1>新建--&g ...

  2. 虚拟机之openVZ简单基础

    OpenVZ的是免费的开源软件,基于GNU GPL协议. OpenVZ的是基于Linux的容器虚拟化. OpenVZ在一台服务器上能够创建创建多个安全隔离的Linux容器(也称为虚拟环境或的VPS), ...

  3. Bootstrap进阶七:LESS语法详解

    1.变量 2.混合 3.带参数混合 4.模式匹配和导引表达式 5.嵌套规则 6.运算 7.Color函数 8.Math函数 9.命名空间 10.作用域 11.注释 12.Importing 13.字符 ...

  4. 2017-2018-1 20179202《Linux内核原理与分析》第七周作业

    一 .Linux内核创建一个新进程的过程 1. 知识准备 操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理 linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状 ...

  5. CSUOJ 1018 Avatar

    Description In the planet Pandora, Jake found an old encryption algorithm. The plaintext, key and ci ...

  6. 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 ...

  7. python 发送邮件(收到的邮件要有发送方才能回复)

    Python使用SMTP(简单邮件传输协议)发送邮件 普通文本邮件 普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain ## -*- coding: UTF-8 -* ...

  8. [ 原创 ]学习笔记-三种向ListView中填充简单文本的方法

    Android 中ListView是很重要的一块内容 掌握ListView的基本用法 对学习安卓起着举足轻重的作用 今天就介绍一下三种向ListView 填充简单文本的方法 填充其他数据类型的用法之后 ...

  9. python的可变与不可变数据类型

    <python的可变与不可变数据类型>     python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象的引用”这句话,其 ...

  10. TCP的三次握手与四次释放

    TCP的三次握手与四次释放 一.名词解释     序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给 ...