记得在我上初一的时候做过这么一道数学竞赛题,就是求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算法的基本原理和步骤,回头再写数学基础以及证明。

RSA算法的基本原理的更多相关文章

  1. 【转】基于RSA算法实现软件注册码原理初讨

    1 前言 目前,商用软件和共享软件绝大部份都是采用注册码授权的方式来保证软件本身不被盗用,以保证自身的利益.尽管很多常用的许多软件系统的某些版本已经被别人破解,但对于软件特殊行业而言,注册码授权的方式 ...

  2. 一个基于RSA算法的Java数字签名例子

    原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性 ...

  3. 信息安全-5:RSA算法详解(已编程实现)[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...

  4. RSA算法原理

    一直以来对linux中的ssh认证.SSL.TLS这些安全认证似懂非懂的.看到阮一峰博客中对RSA算法的原理做了非常详细的解释,看完之后茅塞顿开,关于RSA的相关文章如下 RSA算法原理(一) RSA ...

  5. C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用

    .net中,处于安全的考虑,RSACryptoServiceProvider类,解密时只有同时拥有公钥和私钥才可以.原因是公钥是公开的,会被多人持有.这样的数据传输是不安全的.C#RSA私钥加密,公钥 ...

  6. [已解决] 快速理解RSA算法

    RSA算法基础详解 http://www.cnblogs.com/hykun/p/RSA.html RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/ ...

  7. 公钥私钥和RSA算法

    1, RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2, RSA算法原理(二) http: ...

  8. 跨越千年的RSA算法

    转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  9. (转)RSA算法原理(二)

      作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...

随机推荐

  1. Linux_磁盘分区、挂载、查看

    一.挂载 1.查看设备的挂载情况 lsblk或lsblk -f 2.挂载 需求 :给我们的Linux系统增加一个新的硬盘,并且挂载到/home/newdisk 说明:我们以增加一块硬盘为例来熟悉一下磁 ...

  2. Openstack-L 路由注入方式

    目录 目录 前言 从 Commands 到 Action 操作函数 前言 Openstack 新旧版本提供了不同的路由注入方式,也就是 Route Module 的代码方式不同,就二次开发而言用那一种 ...

  3. hexo next主题深度优化(六),使用hexo-neat插件压缩页面,大幅度提升页面性能和响应速度。

    文章目录 隆重感谢: 背景 开始 试水 成功的案例 安装插件,执行命令. hexo _config.yml文件添加 坑 跳过压缩文件的正确配置方式 压缩html时不要跳过.md文件 压缩html时不要 ...

  4. 2019 牛客多校第二场 H Second Large Rectangle

    题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小 ...

  5. 剑指offer——05重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  6. solr添加IK分词和自己定义词库

    下载IK分词IK Analyzer 2012FF_hf1.zip 下载地址:http://yunpan.cn/cdvATy8899Lrw (提取码:c10d) 1.将IKAnalyzer2012FF_ ...

  7. 3-MySQL高级-事务-命令(2)

    事务命令 表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎 查看表的创建语句,可以看到engine=innodb -- 选择数据库 use jing_dong; -- 查看 ...

  8. uoj21 【UR #1】缩进优化

    题目 题意简介明了,需要找到一个\(T\),最小化 \[\sum_{i=1}^n\left \lfloor \frac{a_i}{T} \right \rfloor+\sum_{i=1}^na_i\% ...

  9. docker使用gitlab持续集成(1)

    修改ssh连接端口vi /etc/ssh/sshd_config 写docker-compose.yml文件配置gitlab version: '3' services: gitlab: image: ...

  10. 006-Java的break和continue

    break 和 continue关键字的使用 break: 结束当前循环 continue:结束当次循环 示例如下 class JavaTest{ public static void main(St ...