Hamge

学习记录

导航

字符加密

# coding=utf-8

import  random
import hashlib
import rsa
from Cryptodome.Cipher import DES
import binascii
from Cryptodome.Cipher import AES
from Cryptodome import Random

def encryption(type,str):
    '''字符串加密'''

    if type in ('MD5', 'md5'):
        '''MD5加密'''
        m = hashlib.md5()
        m.update(str.encode("utf8"))
        return m.hexdigest()

    elif type in ('SHA1','sha1'):
        '''SHA1加密'''
        m = hashlib.sha1()
        m.update(str.encode(encoding='utf-8'))
        return m.hexdigest()

    elif type in ('SHA256' , 'sha256'):
        '''SHA256加密'''
        m = hashlib.sha256()
        m.update(str.encode(encoding='utf-8'))
        return m.hexdigest()

    elif type in ('SHA224' , 'sha224'):
        '''SHA224加密'''
        m = hashlib.sha256()
        m.update(str.encode(encoding='utf-8'))
        return m.hexdigest()

    elif type in ('SHA512' , 'sha512'):
        '''SHA512加密'''
        m = hashlib.sha512()
        m.update(str.encode(encoding='utf-8'))
        return m.hexdigest()

    elif type in ('SHA384' , 'sha384'):
        '''SHA384加密'''
        m = hashlib.sha512()
        m.update(str.encode(encoding='utf-8'))
        return m.hexdigest()

    elif type in ('RSA' , 'rsa'):
        '''RSA加密'''
        key = rsa.newkeys(300)  # 生成随机密钥
        privateKey = key[1]  # 私钥
        publicKey = key[0]  # 公钥
        cryptedMessage = rsa.encrypt(str.encode(), publicKey)

        # RSA解密过程
        message = rsa.decrypt(cryptedMessage, privateKey)
        message = message.decode()

        return cryptedMessage

    elif type in ('DES','des'):
        '''DES加密'''
        # 设置一个密钥
        key = b'abcdefgh'   #需要8位密钥
        # 需要去生成一个DES对象
        des = DES.new(key, DES.MODE_ECB)
        text = str + (8 - (len(str) % 8)) * '='    #字符串最少16位,缺少自动在尾部添加'='至16位字符
        #DES加密
        encrypt_text = des.encrypt(text.encode())
        encrypt_text = binascii.b2a_hex(encrypt_text)

        # DES解密过程
        decrypt_text = binascii.a2b_hex(encrypt_text)
        decrypt_text = des.decrypt(decrypt_text)

        return encrypt_text
    elif type in ('AES' , 'aes'):
        '''AES加密'''
        #密钥  16位
        key = b'abcdefghijklmnop'
        # 生成长度等于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(str.encode())

        # 解密的话要使用key和iv生成新的AES对象
        mydecrypt = AES.new(key, AES.MODE_CFB, ciphertext[:16])
        # 使用新生成的AES对象,将加密的密文解密
        decrypttext = mydecrypt.decrypt(ciphertext[16:])

        return ciphertext

    elif type in ('XOR','xor'):
        '''异或加密'''
        # 加密
        key = 'abcde'  # 密钥
        ml = len(str)  # 分别得到密钥和明文的长度
        kl = len(key)
        key = ml // kl * key + key[:ml % kl]  # 因为要一对一的异或,所以key要变化
        pwd = []  # 通过取整,求余的方法重新得到key
        for i in range(len(key)):
            pwd.append(chr(ord(key[i]) ^ ord(str[i])))  # 一对一异或操作,得到结果,其中,"ord(char)"得到该字符对应的ASCII码,"chr(int)"刚好相反
        #密文
        secret = ''.join(pwd)

    
# 解密 result = [] for j in range(len(key)): result.append(chr(ord(secret[j]) ^ ord(key[j]))) # 跟KEY异或回去就是原明文 result = ''.join(result)

return secret
  else : 
    
return "type error"

if __name__ == "__main__":      

  print encryption('xor','qwe123456')

 

posted on 2019-08-02 10:53  Hamge  阅读(303)  评论(0编辑  收藏  举报