zoukankan      html  css  js  c++  java
  • 对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书

    1.加密算法简介

    加密算法一般分为两种:对称加密和非对称加密。

    1.1对称加密(Symmetric Key Algorithms)

    对称加密算法使用的加密和解密的密钥一样,比如用秘钥123加密就需要用123解密。实际中秘钥都是普通数据在互联网传输的,这样秘钥可能会被中间人截取,导致加密被破解。其过程如下:

    //加密
    E=ENC(M,K)
    
    //解密
    M=DEC(E,K)

    其中M是消息,K是密钥,E是加密后的密文,ENC()和DEC()分别是加密和解密算法。

    常用的对称加密算法包括:

    (1)DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。

    (2)3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。

    (3)AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

    对称加密算法的特点主要有:

    (1)加密方和解密方使用同一个密钥;

    (2)加解密的速度比较快,适合数据比较长时使用;

    (3)密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。

    1.2非对称加密(Asymmetric Key Algorithms)

    所谓非对称,是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。把密钥分为公钥和私钥,公钥是公开的所有人都可以认领,私钥是保密的只有一个人知道。

    非对称加密算法主要有:

    (1)RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

    (2)DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);

    (3)ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

    假如发送方有一对密钥:私钥(KA)和公钥(KPA),接收方也生成一对密钥:私钥(KB)和公钥(KPB),其中(KPA)和(KPB)是公开的。发送方用接收方的公钥对消息加密,加密过程如下

    E=ENC(M,KPB)

    接收方接收到密文后使用自己的私钥进行解密,解密过程如下:

    M=ENC(E,KB)

    这样,即使密文被中间人截获,由于其不知道接收方的私钥,无法破解密文,所以消息仍然是安全的。

    1.3非对称加密RSA

    RSA加密算法是最常用的非对称加密算法,由Ron Rivest、Adi Shamir、Leonard Adleman于1977年在麻省理工学院工作时提出,RSA是三者姓氏首字母的拼接。

    RSA的安全性是基于极大整数因数分解的难度。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

    2.消息摘要(Message Digest)

    消息摘要可以将消息哈希成一个长度固定的唯一值。值唯一的意思是不同的消息转换的摘要是不同的,并且能够确保唯一。该过程不可逆,即不能通过摘要反推明文。常用的消息摘要算法有MD5、SHA1、SHA256、SHA512等。

    3.数字签名(Digital Signature)

    有了RSA,我们可以将其用于网络传输数据的加密。比如A要发送一封Email给B,他不想让任何其他人在传输中看到Email的内容,做法就是使用B的公钥对Email加密,只有B的私钥能够解密(B的私钥唯一性保证信件不会泄露)。

    某天出意外了,有黑客冒充A给B发送Email,并且也用B的公钥加密,导致B无法区分这封邮件是否来自A。怎么办?此时A可以用自己的私钥加密Email,那么B收到邮件后如果用A的公钥可以解密邮件,那么证明这封信肯定来自于A。

    通过这个例子我想我们基本明白非对称加密了的作用了。总结如下:

    (1)公钥的作用:对内容本身加密,保证不被其他人看到;

    (2)私钥的作用:证明内容的来源;

    (3)公钥和私钥是配对关系,公钥加密就用私钥解密,反之亦然,用错的密钥来尝试解密会报错。

    仔细思考会发现,假设A用自己的私钥对Email加密发送,会存在下面的问题:对文件本身加密可能是个耗时过程,比如这封Email足够大,那么私钥加密整个文件以及拿到文件后的解密无疑是巨大的开销。使用数字签名可以解决这个问题。

    (1)A先对这封Email执行哈希运算得到消息摘要;

    (2)然后A用自己的私钥对消息摘要加密,生成数字签名;

    (3)把数字签名加在Email正文后面,一起发送给B。当然,为了防止邮件被窃听,对邮件内容使用B的公钥进行加密,但这个不属于数字签名范畴;

    (4)B收到邮件后用A的公钥对数字签名解密,成功则代表Email确实来自A,失败说明有人冒充,此时数字签名起到了身份认证的作用;

    (5)B对邮件正文通过自己的私钥解密后执行哈希运算得到摘要;

    (6)B会对比第4步数字签名的Hash值和自己运算得到的Hash值,一致则说明邮件未被篡改。此时数字签名用于数据完整性的验证。

    整个过程图示如下:

    通过上面的例子可以发现数字签名是非对称密钥加密技术与数字摘要技术的实际应用,主要有两个作用: (1)对数字签名使用发送方的公钥解密,根据解密是否成功用于身份认证; (2)将解密后的消息摘要与收到的消息的摘要进行比对,用于消息的完整性校验。

    4.数字证书(Digital Certificate)

    4.1数字证书的由来

    在了解数字签名的由来和作用后,仔细想想你可能会存在如下问题: 公钥是公开的并且可以自行导入到电脑,如果有人比如C偷偷在B的电脑用自己公钥替换了A的公钥,然后用自己的私钥给B发送Email,这时B收到邮件其实是被C冒充的但是他无法察觉。确实存在这种情况,这里问题的根源就在于,大家都可以生成公钥、私钥对,无法确认公钥对到底是谁的。 如果能够确定公钥到底是谁的,就不会有这个问题了。例如如果经过某种检查,能够发现B获取的公钥不是“A”的就好了。解决办法就是数字证书。

    4.2数字证书的内容

    先大概看下什么是数字证书,一个证书包含的主要内容有(包含不限于): (1)颁发者(Issuer) 指出是什么机构发布的这个证书,也就是指明这个证书是哪个机构创建的,常见的机构有CA(Certificate Authority,数字证书认证中心)。

    (2)所有者(Subject) 这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。

    (3)生效时间(Valid from) 证书的有效期起始时间。

    (4)失效时间(Valid to) 证书的有效期的结束时间。 过了有效期限,证书就会作废,不能使用了。

    (5)公钥(Public key) 这个非对称加密算法中的公钥。

    (6)指纹算法(Thumbprint algorithm) 生成数字证书指纹的散列算法,一般为SHA1 。

    (7)指纹(Thumbprint ) 根据数字证书中的指纹算法对数字证书进行散列计算获得数字证书的摘要。

    (8)签名算法(Signature algorithm) 产生数字证书的数字签名所使用的加密算法。这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对数字证书的数字签名进行解密,获得数字证书的指纹。指纹的加密结果就是数字签名。

    注意: (1)数字证书的数字签名是如何产生的? 其过程是对数字证书摘要使用数字证书发行者的私钥采用签名算法进行加密获得,用来保证证书的完整性和确认该证书由数字证书发行者颁发。可见,数字证书发行者除了给别人发布证书外,他自己本身也有自己的证书。

    (2)证书发布机构的证书是哪里来的呢? 证书发布机构的数字证书(一般由他自己生成)在我们的操作系统刚安装好时(例如Windows 7等操作系统),这些证书发布机构的数字证书就已经被微软(或者其它操作系统的开发机构)安装在操作系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认安装在操作系统里面,并且设置为操作系统信任的数字证书。这些证书发布机构自己持有与他自己的数字证书对应的私钥,他会用这个私钥加密所有他发布的证书的指纹作为数字签名。

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/zy09/p/13718937.html
Copyright © 2011-2022 走看看