转:http://www.joenchen.com/archives/979
RSA算法可以说在我们使用计算机的每一方面都在发挥着作用, EXE文件的签名算法用的是SHA1 + RSA. 我们每天登陆网银, 使用QQ 无时不刻都在使用着RSA算法. 发明这算法的人, 真心牛逼.
搞这种算法才知道, 数学基础是那么的重要. 尼玛, 以前老师教的时候, 为什么不这样说. 不如是的告诉我们. 工作以后才发现, 在计算机领域数学是必备的学科, 数学学的是否良好. 直接关系到在计算机领域能够专研的深度. 再说回来, 发明这算法的人也太牛逼了.
所以我不准备详细的说这个算法的细节, 估计讲也讲不清楚, 这里有一篇文章讲RSA非常的不错.
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
在我们写代码的过程中也是经常会接触这种算法的. 主要了解如何使用这种算法..
RSA算法简单描述
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d *e%t ==1
这样最终得到三个数: n d e
设消息为数M (M <n)
设c=(M**d)%n 就得到了加密后的消息c
设m=(c**e)%n 则 m == M, 从而完成对c的解密.
注:**表示次方, 上面两式中的d和e可以互换.
在非对称加密中:
n e两个数构成公钥,可以告诉别人.
n d两个数构成私钥,d自己保留, 不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用e加密,这样只有拥有d的你能够对其解密。
RSA的安全性在于对于一个大数n,没有有效的方法能够将其分解, 从而在已知n d的情况下无法获得e,同样在已知n e的情况下无法求得d.为什么无法求的. 这个就不管了. 数学家搞这个吧.
实际生成p, q的过程, 一般使用工具来做RSATool就是一款非常优秀的工具, 可以指定生成多少位的RSA. 指定好E. p, q, n, d都帮我们生成好了.看雪加密解密3里面有一个例子我准备贴出来.
// 初始化MIRACL系统, 初始化500位的10进行制数 |
* n=80C07AFC9D25404D6555B9ACF3567CF1 |
* d=651A40B9739117EF505DBC33EB8F442D |
mip->IOBASE = 16; // 设定16进制模式 |
n = mirvar( 0 ); // 初始化变量 |
m = mirvar( 0 ); // m 放明文:注册码 |
c = mirvar( 0 ); // c 放密文 |
cinstr( m, szSerial ); // 将输入的序列号转换成大数 ,这里szSerial |
cinstr( n, "80C07AFC9D25404D6555B9ACF3567CF1" ); // 初始化模数n |
if ( compare( m, n ) == -1 ) // m < n ,才能对消息m加密 |
powmod( m, e, n, c ); // 计算明文 c= m ^ e mod n |
big_to_bytes( 0, c, szBuffer, FALSE ); // 将 c 从大数转换成字节数组 |
if ( lstrcmp( szName, szBuffer ) != 0 ) // 比较姓名与序列号加密后数据的是否相等? |
SetDlgItemText( hWnd, IDC_Serial, "Wrong Serial!" ); |
SetDlgItemText( hWnd, IDC_Serial, "Success!" ); |
事实上, RSA算法也是可逆的. 用私钥加密出来的, 用公钥也可以解.. 上面这段代码是加密解密3里面的, 正常来说,
这段代码会出现在发布的程序里面, 用来验证用户名. 是否正确. 这里匹配的是用公钥和密文做运算, 计算出明文.. 这段代码有点奇怪,
和我们理解RSA算法有点相反.重点是记住, 虽然RSA是非对称加密算法, 但是如果你有公钥, 私钥. 其实是可逆的.
下面这段代码是用私钥求序列号的.
* n=80C07AFC9D25404D6555B9ACF3567CF1 |
* d=651A40B9739117EF505DBC33EB8F442D |
mip->IOBASE = 16; // 16进制模式 |
c = mirvar( 0 ); // MIRACL的大数类型 |
bytes_to_big( dtLength, szName, c ); // 将姓名转换成大数 |
cinstr( n, "80C07AFC9D25404D6555B9ACF3567CF1" ); // 初始化模数n |
cinstr( d, "651A40B9739117EF505DBC33EB8F442D" ); // 初始化私钥d |
powmod( c, d, n, m ); // 计算m = (c ^ d) mod n |
cotstr( m, szSerial ); // 将m的16进制串表示写入szSerial中,即为注册码 |
SetDlgItemText( hWnd, IDC_Serial, szSerial ); |
正如看雪 加密解密3中所说的, 在实际应用中, 如果我们跟出来了. n和e.. 这个在用公钥计算密文的时候会用到, 跟到n和e以后,
我们就可以利用RSATool之类的工具生成与目标软件中的n相同位数的长度的n, 这时候的 d, p, q我们都知道了. 然后替换软件中的n.
然后利用自己的d就可以写出注册机了.. 当然在网络传输的过程当中也差不多. 实在不行就模拟一个服务端, 改写本地平台的n. 模拟一个d解密.
还有, 实际使用的时候, n一定要搞长一点, 1024. 以上才能保证安全, 刚才用RSATool算了一个128位的因式分解. 一会就求出来了.. 如果太短了. 形同虚设.. 另外加密解密3. 另外一个客户端, 服务端的例子也很不错..
- RSA算法原理
一直以来对linux中的ssh认证.SSL.TLS这些安全认证似懂非懂的.看到阮一峰博客中对RSA算法的原理做了非常详细的解释,看完之后茅塞顿开,关于RSA的相关文章如下 RSA算法原理(一) RSA ...
- SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二)
SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二) http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html ht ...
- (转)RSA算法原理
RSA算法原理(二) 作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我 ...
- RSA算法原理——(2)RSA简介及基础数论知识
上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...
- (转) RSA算法原理(一)
最近用到了RSA加密算法,虽然有现成的,但是想看看它的原理,翻到此文,感觉写得很好,通俗易懂,转了. 作者: 阮一峰 日期: 2013年6月27日 如果你问我,哪一种算法最重要? 我可能会回答&q ...
- 阮一峰:RSA算法原理(一)
今天看到一篇好文章,关于加密算法,收藏了觉得不过瘾,还是自己贴一遍,也能加深一下印象. 原文链接:http://www.ruanyifeng.com/blog/2013/06/rsa_algorith ...
- RSA算法原理(一)
如果你问我,哪一种算法最重要? 我可能会回答"公钥加密算法". 因为它是计算机通信安全的基石,保证了加密数据不会被破解.你可以想象一下,信用卡交易被破解的后果. 进入正题之前,我先 ...
- RSA算法原理——(3)RSA加解密过程及公式论证
上期(RSA简介及基础数论知识)为大家介绍了:互质.欧拉函数.欧拉定理.模反元素 这四个数论的知识点,而这四个知识点是理解RSA加密算法的基石,忘了的同学可以快速的回顾一遍. 一.目前常见加密算法简介 ...
- RSA算法原理——(1)目前常见加密算法简介
艾伦·麦席森·图灵在二战期间主要负责破译德国人的密码系统Enigma,破解密码需要大量的计算,图灵深知工欲善其事必先利其器的道理,于是一台叫作CO-LOSSUS的计算机在1943年被研制出来,后来 ...
- [转] 带你彻底理解RSA算法原理
http://blog.csdn.net/dbs1215/article/details/48953589 1. 什么是RSA RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法 ...
随机推荐
- 转: CreateProcessAsUser 0xC0000005访问冲突问题
转:http://blog.csdn.net/glc22/article/details/77227367 在使用CreateProcessAsUser时出现了 0xC0000005访问冲突问题, ...
- SCU 4443 Range Query
二分图最大匹配,枚举. 可以计算出每一个位置可以放哪些数字,每个数字可以放在哪些位置,这样就可以建二分图了. 如果二分图最大匹配不到$n$,则无解.否则构造字典序最小的解,可以枚举每一位放什么数字,然 ...
- pycharm的安装教程及大坑
在根据网上的教程创建新工程后,发现不能调用第三方库,网上大多给的是print('hello world'),己适python解释器用的pycharm默认的也不能发现错误.后来浏览了一篇文章才恍然大悟, ...
- React Native 系列(九)
前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...
- 解决ubuntu解压windows生成的zip文件时乱码问题
在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 虽然2005年就有人把这报告为bu ...
- vmware12安装centos7系统详解
1.首先需要准备的工具有vmware12和contos7的系统. vmvare12下载地址: http://pan.baidu.com/s/1i5vH50D contos7我自己使用的为1511版本. ...
- 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- bzoj 1006 弦图染色
给定一个弦图,问最少染色数. 对于弦图的一个完美消去序列,从后往前染色,每次染可以染的最小编号的颜色,由完美消去序列的定义,序列任一后缀的点的导出子图中,由该后缀第一个元素及其邻接点导出的子图一定是完 ...
- [转] Spring MVC 4.1.3 + MyBatis 零基础搭建Web开发框架
首先感谢一下润和软件,指引我走上了Spring MVC Web开发的道路. 下面进入正题 搭建开发环境: Netbeans8.0.2 + MySql5.6 + JDK1.7 + tomcat8.0.1 ...
- linux基础命令学习(十二)yum命令
主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 yum list|more 列出所有包文件,可搭配grep查 ...