概述

首先了解一下相关概念:RSA算法:1977年由Ron Rivest、Adi Shamirh和LenAdleman发明的。RSA就是取自他们三个人的名字。

算法基于一个数论:将两个大素数相乘很easy,但要对这个乘积的结果进行 因式分解却很困难,因此可以把乘积公开作为公钥。该算法可以抵抗眼下已知的全部password攻击。

RSA算法是一种非对称算法,算法须要一对密钥。使用当中一个 加密。须要使用另外一个才干解密。我们在进行RSA加密通讯时。就把公钥放在client,私钥留在server。

RSA非对称加密算法,能够验证client和server两方的合法性,安全级别很高。

    这是眼下地球上最重要的加密算法

怎样生成公钥和私钥

1. 选择两个素数p=17。q=11

2. 计算乘机n = 17*11 = 187

3. 对n计算欧拉函数φ(n)=(p-1)(q-1) = 160。

4. 选择e,使得e与φ(n)互素且小于φ(n)。选择e=7  (实际应用中n是一个极大数。通常使用65537)

5. 计算d。使得de mod 160=1且d < 160.正确的值是23,这是由于23*7 = 161 = 10*16+1

这样就得出了公钥PU={7,187} 私钥PR={23,187} 參考这里

怎样加密、解密?

对于某一明文M和密文C,加密和解密有例如以下形式:

加密:C=Me mod n

解密:M=Ce mod n

假设,公钥PU=7,187 私钥PR=23,187。带入公式例如以下图所看到的:

对于加密,须要计算C = 887 mod 187。

利用模运算的性质,计算例如以下:

887mod187 = [(884 mod 187)*(882 mod 187)*(881mod)] mod 187

881 mod 187 = 88

882 mod 187 = 7744 mod 187 = 77

884 mod 187 = 59969536 mod 187 = 132

887mod187 = (88*77*132)mod 187 = 89432 mod 187 = 11

对于解密。计算M = 1123 mod 187 ;

M = 1123 mod 187 = [(111 mod 187)*(112 mod 187)*(114 mod 187)*(118 mod 187)*(118 mod 187)] mod 187

111 mod 187 = 11

112 mod 187 = 121

114 mod 187 = 14641 mod 187 = 55

118 mod 187 = 214 258 881 mod 187 = 33

M = 1123 mod 187 =(11*121*55*33*33)mod 187 = 79720245 mod 187 = 88

RSA的可靠性

回想上面的密钥生成步骤,一共出现六个数字:

       p

  q

  n

  φ(n)

  e

  d

这六个数字之中。公钥用到了两个(n和e)。其余四个数字都是不公开的。当中最关键的是d,由于n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。

那么。有无可能在已知n和e的情况下,推导出d?

  (1)ed≡1 (mod φ(n))。仅仅有知道e和φ(n)。才干算出d。

  (2)φ(n)=(p-1)(q-1)。仅仅有知道p和q,才干算出φ(n)。

  (3)n=pq。

仅仅有将n因数分解,才干算出p和q。

结论:假设n能够被因数分解,d就能够算出,也就意味着私钥被破解。

但是。大整数的因数分解,是一件很困难的事情。眼下,除了暴力破解,还没有发现别的有效方法。

维基百科这样写道:

  "对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之。对一极大整数做因数分解愈困难,RSA算法愈可靠。

  假如有人找到一种高速因数分解的算法。那么RSA的可靠性就会极度下降。但找到这种算法的可能性是很小的。今天仅仅有短的RSA密钥才可能被暴力破解。

到2008年为止,世界上还没有不论什么可靠的攻击RSA算法的方式。

  仅仅要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"

数字签名,私钥加密。公钥解密

下图阐述了怎样使用私钥进行数字签名:

数字签名过程:
1. 获得消息摘要值

2. 对摘要进行DER数据编码

3. RSA私钥加密

4. 字节串到位串的转换。

參考这里

对于RSA算法,用不论什么一方密钥加密都能够用另外一个密钥解密;这也从另外一个角度说明,事实上公钥和私钥是相对而言的。发放当中一个密钥出去。另外一个自然也就成为私钥了

非对称加密案例

以我们项目为例。把序列图画出来,相应看一下

前提条件client和Server商议好,生成一对儿公钥-私钥,client写死到代码中,称之为buildin-key
1. client发送cNonce给Server,Server用私钥对(cNonce+public-key+sNonce)进行数字签名生成signature。Server把sNonce、public-key和signature应答给client
2. client对Server的应答进行验证。

验证过程是:buildin-key调用SecKeyRawSign函数对(cNonce+public-key+sNonce)进行验证。

3. client使用public-key(动态公钥。由于这样更安全)对password摘要、sNonce进行加密。

4. Server收到后,解密数据得到password摘要,匹配password摘要和sNonce是否正确。
当中,第二步是client对Server进行验证,第四步是Server验证client。

iOS平台RSA介绍

我们常见的证书能够看做是公钥,证书中包括了公钥和一些其它信息。IOSclient的加解密。首先我们须要导入Security.framework,在iOS中,我们主要关注四个函数。

SecKeyEncrypt:使用公钥对数据进行加密。

SecKeyDecrypt:使用私钥对数据进行解密。

SecKeyRawVerify:使用公钥对数字签名和数据进行验证,以确认该数据的来源合法性。

SecKeyRawSign:使用私钥对数据进行摘要并生成数字签名。

    从这几个函数中,我们能够看到,公钥能做的事情就有两个:加密数据,以及对server端发来的数据进行签名认证。可是假设你想跟我之前想的一 样。要使用公钥来对数据进行解密,那就没有自带API了。

假设想在server端使用私钥加密数据,然后再在client使用公钥进行解密,以图这样来对交互数据进行加密,看来是行不通的。事实上也应该是这样,公钥是公开的。同一时候,RSA由于都是做大数的运算。算法性能上比較差,假设做大数据量的加解密。对IOS来讲。肯定也是不合适的。


银行U盾

        U盾是一个自带存储计算功能的微型电子板,上面应该有加密存储部件,用于写入证书,但此存储部件无法通过外界USB接口读取,但MPU可读取并解密(细节不清楚),此功能通过物理线路来实现。假设通过硬件解剖。应该能够读取加密后的内容,但还是无法解密。还应该有微型处理器,MPU。用来执行加密算法和响应外界USB接口指令,此为核心部件。

U盾的工作过程:当网银响应用户操作,将全部的指令信息打包,并通过USB口送入U盾。U盾在其内部由MPU使用证书(私钥)进行签名,然后送出。

再由IE通过SSL传送到server。server收到指令包后由用户留存在密钥分发server上的公钥进行签名认证,若认证无误则运行指令。


        理论上来说。在通过两个大素数生成一对公、私钥对后,银行密钥分发管理系统应该将私钥发给用户,并写入U盾,然后将server上的这两个大素数和私钥删除。仅仅留存公钥。

然而,实际project过程中。有非常多安全隐患:

隐患一

    将私钥发给用户的过程中。有可能被第三方截取。尽管此过程使用了SSL通道。并凭银行的password下载。

但如此此用户的电脑被人控制。IE被篡改,还是有被盗取的可能性。只是下载证书是一次性动作,两年才一次。

隐患二

    因为大素数的寻找十分困难,所以在project实现中不可能做到一次一密:也就是通过同一对大素数会生成非常多公、私钥对,并且这一对大素数会在server上留存。一方面,多个共模的公、私钥对之间可能存在相关性。还有一方面。假设有人接触到了server上留存的大素数,非常easy就通过用户的公钥来恢复出私钥。

个人推測,银行应该是通过一个大素数池,随机挑选两个进行生成密钥对。

并且这个大素数池要定期更换,并且非常严格地监管此密钥分发server。 

最后

破解RSA被觉得是全部计算机科学中最难的课题之中的一个。因此。假设你发明了一种可以高速地将一个极大的数字分解为质数的方法,就不只可以入侵瑞士银行的账户系统,并且还可以获得图灵奖了!

浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥的更多相关文章

  1. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  2. 浅谈IM软件client的断线重连、心跳和长在线

    版权声明:原创文章,未经博主同意禁止转载.欢迎点击头像上方"郭晓东的专栏"查看专栏 https://blog.csdn.net/hherima/article/details/27 ...

  3. IM软件业务知识—导航

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  4. 浅谈IM软件怎样建立安全socket连接、登录

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  5. Crypto++应用:非对称加密RSA

    1,非对称加密RSA: (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. ...

  6. 非对称加密RSA的应用及在C#中的实现

    quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html   一说到数据的加密,常常会涉及到这几个单词: ...

  7. 非对称加密算法-RSA算法

    一.概述 1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现 2.java6支持RSA算法 3.RSA算法可以用于数据加密和数字签名 4.RSA算法相对于DES/AES等对 ...

  8. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  9. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

随机推荐

  1. VC之美化界面(内容覆盖十分全面,经典)

    界面美化 摘要本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理: 2. 熟悉Windows消息机制,熟悉MFC的消息映射和 ...

  2. IT第七天 - 类及其属性、方法的理解,断点调试初识,代码优化总结,编程逻辑培养

    IT第七天 上午 类 1.对象:是多个实体抽象出来的共同点集合,对象包括:属性(即实体的特征).方法(即尸体的功能作用) 2.程序中,用类来模拟对象 3.类是抽象的,是对象的类型,是将多个拥有相同属性 ...

  3. Tomcat7 + JRebel6.3.0 + IntelliJ idea 热部署配置过程+错误分析

    以前使用Tomcat的时候直接就可以热部署,现在换了一个使用Spring框架的项目突然就不能热部署了. 网上说在tomcat里conf/context.xml中加入 <Context antiJ ...

  4. 解题报告 HDU1789 Doing Homework again

    Doing Homework again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  5. PPTPD服务端搭建

    http://www.360doc.com/content/14/0304/09/15165033_357558764.shtml . apt-get update; apt-get install ...

  6. NSnotificationCenter 正确使用姿势, removeObject 探索

    最近在做平板的过程中,发现了一些很不规范的代码.偶然修复支付bug的时候,看到其他项目代码,使用通知的地方没有移除,我以为我这个模块的支付闪退是因为他通知没有移除的缘故.而在debug和看了具体的代码 ...

  7. A - Prime Ring Problem(素数环,深搜,打表)

    Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into ...

  8. 安装centos7注意事项

    1,安装centos7注意1和l的区分 2,每一次对/boot/grub2/或者/boot/grub或者/etc/grub/下的文件修改一定要重新编译配置文件sudo grub2-mkconfig - ...

  9. iOS开发之计算动态cell的高度并缓存

    项目中有个类似微博那样的动态cell,文字和图片的多少都不是确定的 刚开始使用autolayout,结果很多问题,最后我发现了一个框架 FDTemplateLayoutCell 写的很好,自动布局ce ...

  10. Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...