概述

首先了解一下相关概念: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. [置顶] mybatis批量新增系列之有主键的表的批量新增

    前面介绍了无主键的表的批量插入,文章地址:http://blog.csdn.net/zhouxiaoyun0228/article/details/9980181 但是在开发中往往许多的表是需要主键的 ...

  2. CodeForces - 27E--Number With The Given Amount Of Divisors(反素数)

    CodeForces - 27E Number With The Given Amount Of Divisors Submit Status Description Given the number ...

  3. Js基础操作

    var a="zhangsan"; document.write(a+":I love JavaScrip"); a="lisi"; doc ...

  4. Group DataList

    一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...

  5. PHP中$_FILES的使用方法及注意事项说明

    $_FILES:经由 HTTP POST 文件上传而提交至脚本的变量,类似于旧数组$HTTP_POST_FILES 数组(依然有效,但反对使用)详细信息可参阅 POST方法上传 $_FILES数组内容 ...

  6. (Problem 3)Largest prime factor

    The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 60085 ...

  7. 深入JDK源码之Arrays类中的排序查找算法(转)

    原文出处: 陶邦仁 binarySearch()方法 二分法查找算法,算法思想:当数据量很大适宜采用该方法.采用二分法查找时,数据需是排好序的. 基本思想:假设数据是按升序排序的,对于给定值x,从序列 ...

  8. poj2676解题报告

    题意:有一个9*9的格子 分成了9个3*3的小子格,一些位置上的已有一些数字..现在要求你把没有数字的位置填上数,要求这个数没有出现在这个位置所在的行.列以及所在的子格 分析: 那么我们对于所有的未填 ...

  9. 设计模式(六)桥连模式Bridge(结构型)

      设计模式(六)桥连模式Bridge(结构型) 1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够 ...

  10. MFC的消息映射机制揭秘

    MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一 ...