• 对称/非对称加密算法


    一、加密算法概述

    加密算法根据内容是否可以还原分为可逆加密非可逆加密

    可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密非对称加密

    二、对称加密算法

    对称加密是指在加密和解密时使用同一个密钥。

    举个简单的例子,我们对一个压缩包进行加密时输入一个密码,那么我们在解密时输入同一个密码进行解密,一个道理。

    这种加密方式有一个很大的缺点就是不安全,因为一旦加密用的密钥泄露了之后,就可以用这个密钥破解其他所有的密文。

    • 加密过程:明文+密钥a,进行加密,输出密文。
    • 解密过程:密文+密钥a,进行解密,输出明文。

    另外在多方通信中,密钥的管理也会非常的麻烦。在数据传送前,发送方和接收方必须商定好密钥,然后使双方都能保存好密钥。其次如果一方的密钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘密钥,也就是说每一组收发方所使用的密钥都是唯一的,例如:A电脑与B、C、D都有通信,那么A就得存储与B、C、D三台电脑通信所用的密钥。这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

    小结:

    优点:速度快,适合加密大量数据。
    缺点:密钥的传递存在着安全隐患,若在网络上传输,密钥泄露,则消息内容泄露。
    常见算法:AES、DES、3DES,国密SM4

    三、非对称加密算法

    非对称加密算法是由一对密钥来进行加解密的过程,分别称为公钥私钥。该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。

    一般有2种用法:

    • 公钥加密,私钥解密。(加密/解密)
    • 私钥加密,公钥解密。(签名/验签)

    3.1 公钥加密,私钥解密。(加密/解密)

    通常个人保存私钥,公钥是公开的(可能同时多人持有)。

    公钥可以被多人(B、C、D)用于数据加密,生成的密文,只能由对应的私钥进行解密,而私钥只有A知道,我们可以通过网络传递公钥,但私钥从始至终没有传递,所以在安全性上避免了私钥泄露导致数据泄露。

    小结:

    优点:非对称加密与对称加密相比,其安全性更好,可以避免秘钥在传递过程中泄露。
    缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
    算法过程:B是发送方,A是接收方,A、B都有各自的公钥和私钥,B使用A的公钥对信息进行加密传输,A收到密文后使用A的私钥解开。
    常见算法:RSA、ECC,国密SM2

    3.2 私钥加密,公钥解密。(签名/验签)

    上述非对称加密方式看起来,安全性上似乎完美。但是实际上存在一个问题。

    公钥是公开的,任何人可以获取,那就意味着,除了B、C、D以外的其他人,可以轻易拿到公钥,传递虚假消息给A,A却无法分辨消息的真实。

    所以,在非对称加密的基础上进行了改进,解决密文在传输过程中可能会被篡改的问题。

    那就是对消息内容进行数字签名,证明这个数据的来源是B/C/D。

    (1)签名

    如上图,B使用A的公钥加密数据前,增加了签名的步骤,将摘要信息用发送者B的私钥加密,与原始数据m一起,再使用接收者A的公钥进行二次加密,将密文传送给接收者。

    在进行数字签名时,我们常使用的是 私钥签名,公钥验签。即用私钥对摘要信息进行加密,用对应的公钥进行解密,得到摘要信息。

     (2)验签

    如上图,接收者A首先使用自己的私钥,对密文进行解密,得到签名+数据m,然后使用发送者B的公钥,对签名进行解密,得到摘要1;

    同时采用相同的摘要计算方式,计算数据m的摘要,得到摘要2。

    比较摘要1和摘要2是否相同,如果相同,则说明原始数据m,没有被篡改,这条消息不是伪造的,的确是由B发送。因为B的私钥,只由B自己保管,其他人只有公钥无法正确加密摘要信息。

     小结:

    数字签名过程:
    (1)B生成一对密钥(公钥和私钥),私钥不公开,B自己保留。公钥为公开的,任何人可以获取。
    (2)B用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给A。
    (3)A收到消息后,在获取B的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是B发送的。

    所以在实际应用中,根据实际情况,可以同时使用加密和签名,达到既不泄露也不被篡改的效果,更能保证消息的安全性

    四、Hash算法

    单向算法,密文长度固定

    Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度唯一hash值,却不能通过这个hash值重新获得目标信息。

    因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

    Hash算法是不可逆的,而其他加密算法是可逆的。

    常见的Hash算法:MD2、MD4、MD5、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1、RIPEMD160,国密SM3

    在2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

    所以,目前SHA-1是流行的用于创建数字签名的Hash算法。

    五、各种加密算法

    对称加密算法:AES/DES/3DES

    AESDES3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。常用的有 AES128AES192AES256 

    5.1 DES算法

    DES 加密算法是一种 分组密码,以 64 位为分组对数据加密,它的密钥长度是 56 位,加密解密用同一算法。

    DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次

    5.2 3DES算法

    是基于 DES 的 对称算法,对 一块数据 用 三个不同的密钥 进行 三次加密,强度更高。

    5.3 AES算法

    AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位256 位,分组长度 128 位

    AES 本身就是为了取代 DES 的,AES 具有更好的 安全性效率 和 灵活性

    非对称加密算法:RSA/ECC

    5.4 RSA算法

    RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。

    ECC算法

    ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU消耗严重)。

    Hash算法:MD5/SHA1

    5.5 MD5算法

    MD5 用的是哈希函数,它的典型应用是对一段信息产生 信息摘要,用于确保文件内容的完整一致性,以防止被篡改。严格来说,MD5 不是一种 加密算法而是摘要算法

    无论是多长的输入,MD5 都会输出长度为 128bits 的一个串 (通常用 16 进制 表示为 32 个字符)。

    5.6 SHA1算法 

    SHA1 是和 MD5 一样流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更强。对于长度小于 2 ^ 64 位的消息,SHA1 会产生一个 160 位的 消息摘要。基于 MD5SHA1 的信息摘要特性以及 不可逆 (一般而言),可以被应用在检查 文件完整性 以及 数字签名 等场景。

    六、各种加密算法比较

    6.1 对称加密算法比较

    名称 密钥长度 运算速度 安全性 资源消耗
     DES  56位 较快  低  中 
     3DES 112位或168位   慢 中  高 
     AES 128、192、256位   快 高  低 

    6.2 非对称加密算法比较 

    名称 成熟度 运算速度 安全性 资源消耗
    RSA
    ECC

    6.3 散列算法比较

    名称 安全性 速度
    SHA-1
    MD5

    6.4 对称/非对称加密算法比较

    6.4.1 对称加密算法

    1. 密钥管理:比较难,不适合互联网,一般用于内部系统
    2. 安全性:中
    3. 加密速度:快几个数量级 (软件加解密速度至少快 100 倍,每秒可以加解密数 M 比特 数据),适合大数据量的加解密处理

    6.4.2 非对称加密算法

    1. 密钥管理:密钥容易管理
    2. 安全性:高
    3. 加密速度:比较慢,适合 小数据量 加解密或数据签名

    (参考博客:https://blog.csdn.net/zyhse/article/details/108696925,https://blog.csdn.net/baidu_22254181/article/details/82594072,感谢)

  • 相关阅读:
    【HDU
    写个shell脚本依次运行每个程序半小时
    Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ
    【UVALive
    【Gym
    【最短路算法】Dijkstra+heap和SPFA的区别
    【Gym 100812C】Story of Princess (走完图所有边)
    【C++】VS2015/VS2017连接Mysql数据库教程
    博客园设置Google-code-prettify渲染代码高亮
    【QML与C++混合编程】用QVariantList传递数组类型成员
  • 原文地址:https://www.cnblogs.com/Brickert/p/15908202.html
Copyright © 2020-2023  润新知