转载我看到的内容,然后加上自己的想法:

 

先粗略解释一下:

一、公钥加密 

假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。

我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密。这样我就可以保护数据了。

我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。
 

二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是1,那么这种加密有什么用处呢?

但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。

用私钥来加密数据的摘要,用途就是数字签名

 

总结:公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。

要发给我的东西,你们用我的公钥加密,私钥只有我才有,其他哪怕拥有我公钥的人是解不开的。

我想要发出去的东西,用私钥来加密,就是数字签名,凡是拥有我公钥的人都能解开。

 

具体点再解释一下(开始烂大街的例子,百度全一样):

1.公钥与私钥原理
1)鲍勃有两把钥匙,一把是公钥,另一把是私钥

2)鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

3)苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

4)鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

5)鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。

个人批注:为什么不直接加密文档(信件)本身?假如这个文档是一个很大的视频呢?非对称加解密本身就慢,大文档更是难以操作,所以只加密文档的哈希而不是整个文档本身。如果你想检测签名是否有效,可以解密签名并自己对文档进行哈希转换(生成摘要),看看这两个值(摘要)是否匹配,这样我们就知道所接收的文档与服务器发送是否完全一样。如果文档在传输中被更改了,则哈希与服务器作为签名提供的值(摘要)不匹配,这叫做无效签名。


6)然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。

7)鲍勃将这个签名,附在信件下面,一起发给苏珊。

8)苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。


9)苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。


10)复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。


11)后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。


12)鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。


13)苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。

这里存在的问题是:如果道格想冒充鲍勃发信给苏珊,于是把自己的公钥和一些相关信息一起加密,信息由证书中心审核,身份一定真实,然后生成一份"数字证书"。苏珊用CA公钥解开,发现这不是鲍勃,然后系统就会提示,此消息颁发的数字证书是为别人准备的,其他人可能尝试向您发送欺骗的数据,请忽视它。此时苏珊只知道这是别人的信息,但是不知道这是道格冒充的。

或者苏珊只有A,B,C机构的公钥,苏珊只相信了A,B,C机构,道格可能用不是很正规的D机构来生成“数字证书”,然后苏珊收信后发现这封信用自己所信任的机构公钥解不开。这个时候系统提示这张数字证书不是由受信任的机构颁发的,可以查看证书以便确认您是否信任该验证机构。只有信任了,能打开查看信息。

如还有疑惑,请见数字证书讲解:数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

 

2.HTTPS
HTTP协议的网站容易被篡改和劫持,如一些不良的运营商会通过代理服务器在你的页面中植入广告等。
因此很多网站选择使用HTTPS协议。HTTPS协议通过TLS层和证书机制提供了内容加密,身份认证,数据完整性三大功能。

1)下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。


2)首先,客户端向服务器发出加密请求。


3)服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。


4)客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。


5)如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

6)如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告

 

 

关于RSA:

RSA 是非对称加密算法

对称的加密算法,加密和解密都是使用的一套密钥,而非对称使用的是两套密钥。

例如我要传的是18,然后我加密的时候是3*6,然后能我解密的时候,可能是(3*3)*(6/3)=9*2=18 来得到这个18.
我加密的时候是一种密钥,
解密的时候又是一种密钥。



1:加密的密钥与解密的密钥不相同 
2:使用私钥加密的内容,只能通过公钥来解密
      使用公钥加密的内容,只能通过私钥来解密
3:公钥,可以对外给任何人的加密和解密密码,公开的,可以任何人访问

4:私钥,私钥是一定要严格保护的,通过私钥可以生成公钥,但是从公钥可以认为是永远无法推导出私钥的。

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

 

下面来看几个案例:

 

----------------------------------------

公钥可以分享给任何人的,例如github 上面就是需要我们上传公钥的。

项目中使用到密钥的案例:
案例一:

GitHub的公钥的生成:

--------------------------------------------------------------------------------------------------------------------------------------

http://bbs.csdn.net/topics/390599148

刚接触Git有很多困惑
1.为什么要公钥和私钥呢,到底有啥用呢(详细点)
2.为什么要把我的公钥加到Git项目之中保存起来
3.比如,某路人甲 想给我的项目提供一些代码,他没有我的公钥可以push给我吗?


2. GIT服务器上存储的是公钥,你本地存储的是私钥,当你push本地代码库到远程代码库,服务器会要求你出示私钥,并且用你出示的私钥和它的公钥配对来完成认证。由于使用的是不对称加密,所以公钥可以公开,只要保管好私钥就可以。
3. 路人甲只要没有私钥,所以无法push。这样才能保证开源项目的完整性,否则阿猫阿狗都去push代码,那项目不就乱套了?如果路人甲想对你的项目做出贡献,那么以GITHUB为例,他会发送一个pull request给你,然后由你来审核他作出的改变,如果审核通过,那么你就可以将他的pull request合并到你工程的某一分支中。这里只以GITHUB为例,私有的GIT服务器可能没有类似功能,比如GITLAB就没有pull request。

--------------------------------------------------------------------------------------------------------------------------------------


-------------------------------------

案例二:

 

支付宝有两种模式:
一种就是demo里面(demo 只是给我们看怎么弄的),本地支付,但是不安全,
客户端生成Order -> 使用私钥进行签名 -> payInfo -> 支付宝服务器使用商户的公钥进行校验
一种是通过自己的服务器进行签名:
客户端生成order -> 提交给服务器 -> 服务器计算金额,orderInfo -> 通过私钥生成签名sign -> pageInfo -> 回来给客户端客户端再将这个信息给支付宝

 

支付宝也需要用到公钥,私钥,我们的项目里面填写私钥就好了,支付宝那边已经有了公钥了



公钥,上传给服务器,服务器就认可这台电脑私钥加密的东西。
在PayDemoActivity:里面有。下面的几个是公司给的或者是你帮公司申请的。

// 商户PID
public static final String PARTNER = "2088601082136243";
// 商户收款账号
public static final String SELLER = "xiexiewangkeji@163.com";
// 商户私钥,pkcs8格式
// 客户端使用的私钥,对于请求进行数字签名,传给服务器,服务器使用公钥进行验证
public static final String RSA_PRIVATE = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM62H9NVaAFL54uyqjNv11J7eeOsh/xRQ2c31zUXGmFvuq5iUVxahQBNKa5O3w4qoOdzCt6yw+Fcl9hN/9NV9pWiCUBzNBluUMyqTb2Qs+bULisevBk810Uevo/Cct+gu+6e2tTal2dXszAXK7tYjJqd5Rzmc/qJRzFPNn4j3W2NAgMBAAECgYEAwEDBHtPrNHF9O/+Cru5RLGSs++SmYTTPZLuZy8XeAkthK/lDRIrn8lzR7E1sxYc+OaVUscU/y2VL0KDS06K6/8gVCcJe4UiCjIBXyhmwNBKBHf4jlKKAlaWZkPwJSxpfE1O16epBvTHZdyEY0ALfMnvQlUZ8RAAXo5DHGutHscECQQD++08BYfWDhYVpDzlEcPM+9fyecen8vGiX/T0+LB88kREIldjiQmqJyBvKECRBUJYg+2mqHGQjQMfBHfaaUsC9AkEAz4l27Qps5e93EmNlDn3RsMH+JVzMu0442nA8SbpRJOtmuqYDZAH7W2uj3J3J1gIbZg5zCxQc9rLDYcq2wo21EQJBAK1x/ZgPLpa8qLeCZ44q1wwpACI3ktccwnlBBfvYv5bPhyqz48hlLVt0B5M3z7GuQ7FD0+inT2a7liXDYBAx4nECQD8SSsc9LN0wSmKXPGYMDMcIHcGjE0E1Q4f3JgtOCU0MEVtWCp/BDm+5JcJtXaKhX0xDxeivAyJiL4ivv50ezdECQHptoOYG0tMCHL0oOXrZXsdpAFL/c8vX25Oq/uaYaR+Zgv02ipt+81YQ+8nYTwD55TZytt0TcifqUQhDf0y7XyQ=";
// 支付宝公钥
public static final String RSA_PUBLIC = "";

 

更加详细的讲解:

数字证书原理(ssl,https):http://www.360doc.com/content/13/0809/14/1073512_305848184.shtml

 

 

================Talk is cheap, show me the code================