array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 RSA算法的基本原理 - 爱码网
mod109

记得在我上初一的时候做过这么一道数学竞赛题,就是求7的222次方的个位数字。当时教材上介绍的解题方法是将222分解成4*55+2,然后算出7的2次方个个位数字即为要算的数值。当时年幼无知的我根本不了解整个过程为什么要这么计算,只知道根据规律也可以得出响应的结果,然后后来才知道这个里面蕴含着一个非常重要的定理。

欧拉定理:若n,a为正整数,且n,a互质,如果算出不大于n且与n互质的正整数个数φ(n),那么a的φ(n)次方除于n的余数为1.

用公式表明即为:

以3和5两个数为例,假设a=3,n=5,那么不大于5且与5互质的数有1,2,3,4四个数字,那么φ(n)=4,根据公式就可以得出来3的4次方81除于5余数是1.

再回到上题7的222次方的个位数字,其实这道题也就算要计算7的222次方除以10的余数。因为7和10是互质数且φ(10)=4,那么根据欧拉定理便有7的4次方(2401)除以10余数是1。当然无论多少个个位数为1的数相乘其个位数字仍然是1,所以整个题目就转变成算7的二次方了结果是9.

以上所讲的只是笔者曾经做过的一个无关痛痒的数学竞赛题,但是如今这个思想却成了目前地球上最重要的加密算法的基础。目前常用的加密算法主要分为对称加密和非对称加密两种。对称加密就是加密和解密密钥完全一样,这样以来加密解密过程简单而效率高,不过由于传输当中需要把密钥一并传输而是的安全性能下降;而非对称加密则是加密密钥和解密密钥彼此独立,这样使得安全性大大增加,而典型的非对称加密算法便是RSA算法。

RSA算法的基本步骤可以分为以下几步:(以假设A和B通信为例子)

1,A首先选择两个质数,假设这里选择,61和53,实际选择的质数都相当大

2,将两个数相乘得到3233,然后计算出不大于3233且和3233互质的数,根据欧拉函数的定义可以算出是φ(3233)=(61-1)*(53-1)=3120

3,寻找一个不大于3120的质数e,这里选择e=17,然后计算摸反元素,也就是计算一个整数d,是的e和d相乘的数除以3120余数为1。由于e=17,所以这一步可以写出以下等式:17*d = 3120k+1.由于K的值我们不关心,所以也可以写成17d+3120k=1.于是通过解这个二元一次不定方程就可以算出d来。通过辗转相除法计算出一组解为(2753,-15).此时加密公钥为(3233,17),私钥为(3233,2753).

4,真正个通信此时开始,假设A要把信息65发给B,实际上首先计算下式中的C:6517 ≡ C(mod 3233),这里计算出的C=2790。然后A将2790发给B

5,当B收到2790后解密,解密实际上就是计算下面的C:27902753 ≡ C (mod 3233),当然算出来就是65.此时加密解密的过程就结束了。

通过以上算法可以看出来,如果想破解RSA必须要根据公钥计算出私钥,要想通过3233和17计算出2753必须要首先得到φ(3233),当然直接去暴力计算φ(3233)必须首先找出来61和53这两个数字。不过可惜的是大数分解目前而言没有相对良好的算法,将一个四位数分解很容易,但是对于一个四十位数恐怕就不是那么容易了,真正强行计算首先还要实现大数相乘算法,两个很大的数相乘所耗费的时间远远不是一条imul指令可以完成的。

当然超级计算机和量子计算机的问世将会对RSA算法的可靠性产生极大威胁,但是随着计算机计算速度的不断提高RSA算法的密钥长度也会不断增长,其破解难度恐怕也会不断增加,但谁能笑到最后还是得等时间的答复。今天就只简单写了下RSA算法的基本原理和步骤,回头再写数学基础以及证明。

分类:

技术点:

相关文章: