zoukankan      html  css  js  c++  java
  • python的加密方式

    MD5加密

    这是一种使用非常广泛的加密方式,不可逆的,在日常字符串加密中经常会用到,下面我简单介绍一下这种方式,主要用到Python自带的模块hashlib,测试代码如下,先创建一个md5对象,然后直接加密就行:

    import hashlib
    
    def MD5(string):
        '''md5加密'''
        h1 = hashlib.md5()     # 创建md5对象
        # 声明encode
        h1.update(string.encode(encoding = 'utf-8'))
        return h1.hexdigest()
    
    if __name__ == "__main__":
        string = "MD5加密"
        print('MD5加密前为:' + string)
        print('MD5加密后为:' + MD5(string))
    

    运行结果:

    MD5加密前为:MD5加密
    MD5加密后为:e5c7bda34849527574a025bc06867c11
    

    哈希加密

    这里以SHA1(安全哈希)为例,简单介绍一下Python是如何进行哈希加密的,也用到hashlib这个模块,测试代码如下,非常简单,先创建sha1对象,然后直接加密就行,这里也支持 SHA224,SHA256等加密方式:

    import hashlib
    
    def hash(string):
        '''哈希加密'''
        h1 = hashlib.sha1()     # 创建hash对象
        # 声明encode
        h1.update(string.encode(encoding = 'utf-8'))
        return h1.hexdigest()
    
    if __name__ == "__main__":
        string = "MD5加密"
        print('MD5加密前为:' + string)
        print('MD5加密后为:' + hash(string))
    

    运行结果:

    hash加密前为:MD5加密
    hash加密后为:983bb73e82bd715e65584ea6580bad4ec321c0f4
    

    DES加密

    这是一个分组加密算法,解密和加密是同一个算法,下面我简单介绍一下这种方式,主要用到pycryptodome这个模块,输入安装命令pip install pycryptodomex,测试代码如下,需要单独定义一个密钥:

    from Cryptodome.Cipher import DES
    import binascii
    
    # 设置一个密钥
    key = b'abcdefgh'
    # 需要去生成一个DES对象
    des = DES.new(key,DES.MODE_ECB)
    # 需要加密的数据
    text = "This is a key!"
    text = text + (8 - (len(text) % 8)) * '='
    print("text:%s" % text)
    
    # DES加密过程
    encrypt_text = des.encrypt(text.encode())
    encrypt_text = binascii.b2a_hex(encrypt_text)
    print("DES加密后:" + encrypt_text.decode())
    
    # DES解密过程
    decrypt_text = binascii.a2b_hex(encrypt_text)
    decrypt_text = des.decrypt(decrypt_text)
    print("DES解密后:" + decrypt_text.decode())
    

    运行结果:

    text:This is a key!==
    DES加密后:a5ee554e36736a5d9b6db2cd9442ff38
    DES解密后:This is a key!==
    

    AES加密

    这也是一种广泛使用的加密方法,是对DES的改进和替代,下面我简单介绍一下这种方式,也用到pycryptodome这个模块,测试代码如下,稍微有些复杂

    from Cryptodome.Cipher import AES
    from Cryptodome import Random
    from binascii import b2a_hex
    
    # 密钥
    key = b'This is a 16 key'
    # 要加密的明文
    data = "AES加密"
    # 生成长度等于AES块大小的不可重复的密钥向量
    iv = Random.new().read(AES.block_size)
    # 使用key和iv初始化AES对象,使用MODE_CFB模式
    mycipher = AES.new(key,AES.MODE_CFB,iv)
    # 加密的明文长度必须为16的倍数
    # 将iv(密钥向量)加到加密的密文开头,一起传输
    ciphertext = iv + mycipher.encrypt(data.encode())
    # 解密的话要使用key和iv生成新的AES对象
    mydecrypt = AES.new(key,AES.MODE_CFB,ciphertext[:16])
    # 使用新生成的AES对象,将加密的密文解密
    decrypttext = mydecrypt.decrypt(ciphertext[16:])
    
    print("ASD加密后:",b2a_hex(ciphertext)[16:])
    print("ASD解密后:",decrypttext.decode())
    

    运行结果:

    ASD加密后: b'18541e53ebfe5eef40d3d4631dc3c313d4'
    ASD解密后: AES加密
    

    RAS加密

    这是一种非对称加密算法,在公开密钥加密和电子商业中经常会用到,下面我简单介绍一下这种方式,主要用到rsa这个模块,安装命令pip install rsa,测试代码如下,需要单独定义一个公钥和私钥

    import rsa
    
    key = rsa.newkeys(3000)   # 生成随机密钥
    privateKey = key[1]   # 私钥
    publicKey = key[0] # 公钥
    message = "RSA加密"   # 要加密的明文
    message = message.encode()
    
    # RSA加密过程
    cryptedMessage = rsa.encrypt(message,publicKey)
    print("RSA加密后:",cryptedMessage)
    
    # RSA解密过程
    message = rsa.decrypt(cryptedMessage,privateKey)
    message = message.decode()
    print("RSA解密后:",message)
    

    运行结果:

    RSA加密后: b"x04xf2xafxbbxe1xffWxd5xabT`.xd8x02xa7x85xdawFx15Qx88xd9xafx9bxb7@gbx8ax81xcex8c2GCV;
    x8ax91NFxd8xb5x99x0bxc5xf9xbax94xd4lx8bxa9axd5x80x98xdebxcbxf9Nx8c'Yx9cXxcaxf5$x07Ax1a@xb6-xc7xb22iNu0xf6x800x9d	Bx93xe2xa5Pxe7'+1*x8aLVxcacxd6x81xfbx0bxeexe9x8bxc4K\x0c/x80x184Tx80xx87xdcxb3=x12x97x8cxa6xecXFx92x87m$x8ex1cxe7x93;1x9a;n`xd8xdb|xbfWx04xfcxbbxec&x8bx91%xd6x12Qexa9x84xd1x0cxacxd7xabGx945W7x12xaexf3#xd4xf9xaed^Cxae'wx8aMx01
    xf9x80x1e	l4x1c)\x98x01]e+[cxf34x99{7xa5.xefSxd6x99xfax9fx7fxe0x9bxa2xf9<p0%xa1iGx02xf9x0coxdexdaxabx96`yxb8xb0xe8xd0 xa9xa1x97@xe7x06xa8xacx19-[Wxefx0fRxb7\Hx0bx15^x0e@x86gxb8xc8U=xe7xffx06
    x93<Pxc3xa4xa5
    x8e5xef+Dx9cM?x1bx11Tx8fxa2xb9xa4,x03nx1exd0xbcx1ftxabx879x11xe9x01xffJxf9x87xb4/jxf1Ox14x19xacx8axb8Cxe5~oxa9]xca,xe4xe6x18rxd9x8f]xa1xf8Gxedx8cxb6Fx9fxabux12xc3x93xf2] XOxb0*xadH0gx88x0cxb9"
    RSA解密后: RSA加密
    
  • 相关阅读:
    eclipse中将web项目部署到tomcat
    mysql + Fluently NHibernate + WebAPI + Autofac
    无状态
    mysql备份及还原
    【jmeter】jmeter 常用组件 介绍
    【测试小方法】通过谷歌开发者工具手动修改位置信息
    【jmeter】jmeter 设置线程组 各个字段的概念
    【jmeter】jmete 安装介绍
    【腾讯位置服务web service】腾讯位置服务web service api
    【python】python 的 lambda 函数
  • 原文地址:https://www.cnblogs.com/kadycui/p/11027107.html
Copyright © 2011-2022 走看看