Python MD5加密算法及对称与非对称加密算法

1.1 加密算法分类

加密算法主要分为:哈希算法、对称加密算法、非对称加密算法。

  • 哈希算法:如:MD5/SHA256

  • 对称加密算法:如:DES/AES/CBC

  • 非对称加密算法:如:RSA

  • 此外,还有一种编码算法,叫Base64(注意它不是加密算法),也是用的比较多的。

    1.1 哈希算法

    哈希是一种加密算法,也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(Hash Value)、杂凑值或者消息摘要。它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。

    易压缩: 对于任意大小的输入x,Hash值的长度很小,在实际应用中,函数H产生的Hash值其长度是固定的。

    易计算: 对于任意给定的消息,计算其Hash值比较容易。

    单向性: 对于给定的Hash值,要找到使得在计算上是不可行的,即求Hash的逆很困难。在给定某个哈希函数H和哈希值H(M)的情况下,得出M在计算上是不可行的。即从哈希输出无法倒推输入的原始数值。这是哈希函数安全性的基础。

    代表:MD5、SHA256等

    1.2 对称加密算法

    双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密。

    优点: 速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。

    缺点: 在数据传送前,发送方和接收方必须商定好秘钥,然后 使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘 钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

    代表:DES、AES、CBC等

    1.3 非对称加密算法

    一对密钥由公钥和私钥组成(可以使用很多对密钥)。私钥解密公钥加密数据,公钥解密私钥加密数据(私钥公钥可以互相加密解密)

    缺点: 速度较慢

    优点: 安全

    代表: RSA、Elgamal、背包算法、Rabin、Diffie-Hellman、ECC(椭圆曲线加密算法)。 使用最广泛的是RSA算法,Elgamal其次。

    1.4 Base64编码

    Base64是编码技术而不是加密技术。可以将任意的字节数组数据,通过算法,生成只有(大小写英文、数字、+、/)(一共64个字符)内容表示的字符串数据。即将任意的内容转换为可见的字符串形式。提供解码功能。

    2. 加密算法使用场景

  • 用户登录:md5/非对称 rsa

  • 数据传输一致性:md5

  • 数据库表存储:md5(双重)/自定义

  • MD5算法代码实例:

    import hashlib
    pwd='sdfsdfsdf'
    md5=hashlib.md5()
    md5.update(pwd.encode(encoding='UTF-8'))
    print('MD5加密后结果为:'+md5.hexdigest())
    

    非对称加密算法代码实例 rsa:

    #安装rsa
    #pip install rsa
    import rsa
    #1.待加密的字符串
    str="sdfsdfsdf"
    #2.实例化加密对象
    (pubkey,privkey)=rsa.newkeys(1024)
    #3.用公钥加密
    pwd1=rsa.encrypt(str.encode(),pubkey)
    print("加密后的结果1为:"+pwd1.hex())
    pwd2=rsa.encrypt(str.encode(),pubkey)
    print("加密后的结果2为:"+pwd2.hex())
    #4.用私钥解密
    depwd1=rsa.decrypt(pwd1,privkey)
    print("解密后的结果为:"+depwd1.decode('UTF-8'))
    depwd2=rsa.decrypt(pwd2,privkey)
    print("解密后的结果为:"+depwd2.decode('UTF-8'))
    

    编码算法 Base64 实例:

    import base64
    str="sfdsfdsfasewrewtrevcxvcxdfds"
    pwd=base64.b64encode(str.encode("UTF-8"))
    print('编码后的结果为:',pwd)