zoukankan      html  css  js  c++  java
  • 常见加密解密 -- pycryptodomex库

    安装

    • windows
      • pip install pycryptodomex
    • ubuntu
      • pip install pycryptodome

    加密方式

    • 单向加密:MD5
      • 只能对数据进行加密,而不能解密
    • 对称加密:DES、AES
      • 数据加密与解密使用相同的密钥
    • 非对称加密:RSA

    MD5  

    https://www.cnblogs.com/jiyu-hlzy/p/11788091.html


    DES

    from Cryptodome.Cipher import DES
    import binascii
    
    # DES加密数据的长度须为8的的倍数,不够可以用其它字符填充
    text = 'Welcome to DES'
    if len(text) % 8 != 0:
        text = text + "+" * (8 - len(text) % 8)
    # 密钥:必须为8字节
    key = b'12345678'
    # 使用 key 初始化 DES 对象,使用 DES.MODE_ECB 模式
    des = DES.new(key, DES.MODE_ECB)
    # 加密
    result = des.encrypt(text.encode())
    
    print('加密后的数据:', result)
    # 转为十六进制    binascii 的 b2a_hex 或者 hexlify 方法
    print('转为十六进制:', binascii.b2a_hex(result))
    # 解密
    print('解密后的数据:', des.decrypt(result))
    




    AES

    from Cryptodome.Cipher import AES
    from Cryptodome import Random
    import binascii
    
    text = 'Welcome to AES'
    # 密钥key 长度必须为16(AES-128)、24(AES-192)或 32(AES-256)的Bytes长度
    key = b'1234567890ABCDEF'
    # 生成长度等于AES块大小的不可重复的密钥向量
    iv = Random.new().read(AES.block_size)
    # 使用 key 和 iv 初始化AES对象,使用 AES.MODE_CFB 模式
    aes = AES.new(key, AES.MODE_CFB, iv)
    # 加密
    result = aes.encrypt(text.encode())
    # 解密
    # 不能在encrypt()之后调用decrypt()
    # 需要用相同的key和iv初始化新的AES对象
    decrypt_aes = AES.new(key, AES.MODE_CFB, iv)
    
    print('密钥:', key)
    print('iv:', iv)
    print('十六进制的iv:', binascii.b2a_hex(iv))
    print('加密后的数据:', result)
    print('转为十六进制:', binascii.b2a_hex(result))
    print('解密后的数据:', decrypt_aes.decrypt(result))
    



    RSA

    • 公钥加密、私钥解密
    import rsa
    
    text = 'Welcome to RSA'
    # 生成密钥对
    pubkey, prikey = rsa.newkeys(1024)
    # 加密:使用公钥
    result = rsa.encrypt(text.encode(), pubkey)
    print('加密后的数据:',result)
    # 解密:使用私钥
    print('解密后的数据:',rsa.decrypt(result, prikey))
    



    • 创建公钥
    import rsa
    
    text = 'Welcome to RSA'
    
    # 公钥有两个值  n,e
    public_n = "e0b509f62a8fc9" * 4
    public_e = '010001'
    
    # n、e必须为整数
    # 将16进制的字符串转为整数
    rsa_n = int(public_n, 16)
    rsa_e = int(public_e, 16)
    print('n:{}
    e:{}'.format(rsa_n, rsa_e))
    
    # 创建公钥 rsa.PublicKey(n,e)
    pubkey = rsa.PublicKey(rsa_n, rsa_e)
    print('公钥类型:', type(pubkey))
    print('公钥:', pubkey)
    print('n:{}
    e:{}'.format(pubkey.n, pubkey.e))
    print('加密后的数据:', rsa.encrypt(text.encode(), pubkey))
    



    • 加签、验签
    import rsa
    
    pubkey, prikey = rsa.newkeys(1024)
    # 加签    rsa.sign(原信息,私钥,加密方式)  生成加签过后的信息
    signMessage = rsa.sign('投资房地产'.encode(), prikey, 'MD5')
    print(signMessage)
    # 验签    rsa.verify(需要验证的信息,加签过后的信息,公钥)
    # 如果需要验证的信息,是原信息,返回加密方式
    veri_1 = rsa.verify('投资房地产'.encode(),signMessage, pubkey)
    print('投资房地产:',veri_1)
    # 如果需要验证的信息,不是原信息(表示信息被篡改过),则验证失败报错:Verification failed
    veri_2 = rsa.verify('投资互联网'.encode(),signMessage, pubkey)
    print('投资互联网,',veri_2)
    




  • 相关阅读:
    redis下载安装及php配置redis
    php--小数点问题
    php--0与空的判断
    php--判断是否是手机端
    php--ip的处理
    mysql--sql_mode报错整理
    mysql-建表、添加字段、修改字段、添加索引SQL语句写法
    Python-多任务复制文件夹
    Python学习笔记(十一)——赋值、深拷贝与浅拷贝
    Python学习笔记(十)—JSON格式的处理
  • 原文地址:https://www.cnblogs.com/jiyu-hlzy/p/12132606.html
Copyright © 2011-2022 走看看