记得在我上初一的时候做过这么一道数学竞赛题,就是求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. OAuth2.0的理解-转自阮一峰博客

    一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...

  2. Instrumentation 实践详解

    原文地址:https://blog.csdn.net/pengjunlee/article/details/72717622

  3. 关于double的输入输出

    double定义的变量输入的时候一定要%lf输入,要是%f输入的话,得到的结果会是0 float输入的时候是%f 但是在输出的时候%lf和%f都可以输出 建议使用double类型时,用%lf输入,%f ...

  4. super 关键字的使用及说明

    super 关键字主要用于访问父类的变量和方法. 代码示例: public class Student { String name; public Student(){ System.out.prin ...

  5. springboot中参数处理

    springboot1中处理是这样的 @Configuration public class WebConfig extends WebMvcConfigurerAdapter{ @Autowired ...

  6. elasticsearch实现读写分离

    简介 今天我们不讲三国,我们讲一讲elasticsearch(以下简称ES)读写分离,这是个好东西,全文索引的时候使用它贼得劲,对elasticsearch索引原理不太清楚的,请自行查找相关的文章 这 ...

  7. MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合 1.基本数据类型 我们常见有传递 int, string, bool, double, decimal 等类型. 需要注意的是前台传递的参 ...

  8. 使用mapreduce对日志进行清洗

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:当前页面 网站日志分析项目案例 ...

  9. 归档和解档配合NSFile存储数据

    NSString *Name = @"yc"; //第一个常量NSDocumentDirectory表示正在查找沙盒Document目录的路径(如果参数为NSCachesDirec ...

  10. github代码推送

    git init // 初始化版本库 git add . // 添加文件到版本库(只是添加到缓存区),.代表添加文件夹下所有文件 git commit -m "first commit&qu ...