zoukankan      html  css  js  c++  java
  • SSH私钥公钥加密理解

    基本概念

    密钥对

    在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。

    公钥

    公钥用来给数据加密,用公钥加密的数据只能使用私钥解密

    私钥

    如上,用来解密公钥加密的数据。

    摘要

    对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得

    签名

    使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。(看最下面的一部分就明白了)

    签名验证

    数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。

    加密

    是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击。其重点在于数据的安全性。

    密钥分类

    对称密钥加密

    又称私钥加密或会话密钥加密算法,即信息的发送方和接收方使用同一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。AES、DES等都是常用的对称加密算法。

    非对称密钥加密

    又称公钥密钥加密,它需要使用不同的密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。

    在现代密码体制中加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。RSA、DSA等是常用的非对称加密的算法。

    RSA 加解密算法

    RSA 是一个流行的非对称加密算法, 生成公私钥内容如下:

    # 生成秘钥
    openssl genrsa -out test.key 1024
    # 从秘钥中导出公钥
    openssl rsa -in test.key -pubout -out test_pub.key
    # 公钥加密文件
    echo "test" > hello
    openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
    # 私钥解密文件
    openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
    

    不可逆加密算法

    不可逆加密算法主要用于校验文件的一致性,摘要算法就是其中一种。常用的摘要算法有 MD5。

    摘要算法用来把任何长度的明文以一定规则变成固定长度的一串字符。在做文件一致性校验的时候,我们通常都是先使用摘要算法,获得固定长度的一串字符,然后对这串字符进行签名。接收者接收到文件后,也会执行一遍摘要算法后再签名。前后数据一致,则表示文件在传输过程没有被窜改。

    base64

    特别需要注意的是,base64 不是加密算法,它是编码方式。 它可以方便传输过程 ASCII 码和二进制码之间的转换。类似于图片或者一些文本协议,在传输过程中通常可以使用 base64 转换成二进制码进程传输。

    公钥私钥的原则

    • 1.一个公钥对应一个私钥。
    • 2.密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
    • 3.如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
    • 4.如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。

    非对称密钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不一样的,下面我就详细讲解一下两者的区别。

    公开密钥过程

    比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

    • 1.Bob将他的公开密钥传送给Alice。
    • 2.Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
    • 3.Bob用他的私人密钥解密Alice的消息。
      上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

    公开密钥认证过程

    身份认证和加密就不同了,主要用户鉴别用户的真伪。这里我们只要能够鉴别一个用户的私钥是正确的,就可以鉴别这个用户的真伪。

    还是Alice和Bob这两个用户,Alice想让Bob知道自己是真实的Alice,而不是假冒的,因此Alice只要使用公钥密码学对文件签名发送给Bob,Bob使用Alice的公钥对文件进行解密,如果可以解密成功,则证明Alice的私钥是正确的,因而就完成了对Alice的身份鉴别。整个身份认证的过程如下:

    • 1.Alice用她的私人密钥对文件加密,从而对文件签名。
    • 2.Alice将签名的文件传送给Bob。
    • 3.Bob用Alice的公钥解密文件,从而验证签名。
      上面的过程可以用下图表示,Alice使用自己的私钥加密,Bob用Alice的公钥进行解密。

    公钥和私钥的区别和联系

    • 1.鲍勃有两把钥匙,一把是公钥,另一把是私钥。

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

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

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

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

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

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

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

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

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

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

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

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

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

    • 15.首先,客户端向服务器发出加密请求。

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

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

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

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

    总结

    密钥指的是私钥或者公钥 --> 密钥=私钥/公钥
    密钥对,针对的是非对称加密 --> 密钥对=私钥+公钥

    既然是加密,肯定是不希望别人知道我的消息,所以只要我才能解密,所以得出,公钥负责加密,私钥负责解密。 同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以得出,私钥负责签名,公钥负责验证。

    那么这里一共有两组四个密钥:

    • A的公钥(PUB_A)
    • A的私钥(PRI_A)
    • B的公钥(PUB_B)
    • B的私钥(PRI_B)

    公钥一般用来加密,私钥用来签名。通常公钥是公开出去的,但是私钥只能自己私密持有。公钥和私钥唯一对应,用某个私钥签名过的内容只能用对应的公钥才能解签验证;同样用某个公钥加密的内容只能用对应的私钥才能解密。

    这时A向B发送信息的整个签名和加密的过程如下:

    • A先用自己的私钥(PRI_A)对信息(一般是信息的摘要)进行签名。
    • A接着使用B的公钥(PUB_B)对信息内容和签名信息进行加密。

    这样当B接收到A的信息后,获取信息内容的步骤如下:

    • B用自己的私钥(PRI_B)解密A用B的公钥(PUB_B)加密的内容
    • B得到解密后的明文后用A的公钥(PUB_A)解签A用A自己的私钥(PRI_A)的签名。
      从而整个过程就保证了开始说的端到端的唯一确认。A的签名只有A的公钥才能解签,这样B就能确认这个信息是A发来的;A的加密只有B的私钥才能解密,这样A就能确认这份信息只能被B读取。
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/even160941/p/15248374.html
Copyright © 2011-2022 走看看