zoukankan      html  css  js  c++  java
  • python3 DES/AES/RSA加密

    DES/AES加密

    DES加密

    第一种方法

    from pyDes import *
    import binascii
    import pyDes
    
    # 秘钥
    KEY = 'PASSWORD'
    def des_encrypt(s):
        """
        DES 加密
        :param s: 原始字符串
        :return: 加密后字符串,16进制
        """
        secret_key = KEY
        iv = secret_key
        k = des(secret_key, ECB, iv, pad=None, padmode=PAD_PKCS5)
        en = k.encrypt(s, padmode=PAD_PKCS5)
        return binascii.b2a_hex(en)
    
    
    def des_descrypt(s):
        """
        DES 解密
        :param s: 加密后的字符串,16进制
        :return:  解密后的字符串
        """
        secret_key = KEY
        iv = secret_key
        k = des(secret_key, ECB, iv, pad=None, padmode=PAD_PKCS5)
        de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
        return de
    
    s="python3456"
    #加密之后大写
    res=(des_encrypt(s)).upper()
    print(res)
    
    s=b"04201E4B9788BB987C3A47FF367F76F0"
    res=des_descrypt(s)
    print(res)
    

    第二种方法

    import pyDes
    import base64
    
    Key = "PASSWORD"
    Iv = None
    def bytesToHexString(bs):
        return ''.join(['%02X ' % b for b in bs])
    def hexStringTobytes(str):
        str = str.replace(" ", "")
        return bytes.fromhex(str)
    
    # 加密
    def encrypt_str(data):
        # 加密方法
        method = pyDes.des(Key, pyDes.ECB, Iv, pad=None, padmode=pyDes.PAD_PKCS5)
        # 执行加密码
        k = method.encrypt(data)
        data = bytesToHexString(k).replace(' ','')
        return data
    
    
    # 解密
    def decrypt_str(data):
        method = pyDes.des(Key, pyDes.ECB, Iv, pad=None, padmode=pyDes.PAD_PKCS5)
        # 对base64编码解码
        k =hexStringTobytes(data)
        return method.decrypt(k)
    
    
    Encrypt = encrypt_str("python3456")
    print(Encrypt)
    Decrypt = decrypt_str(Encrypt)
    print("Dec=",Decrypt)
    

    第三种方法

    from Cryptodome.Cipher import DES
    import binascii
    
    def pad(text):
        while len(text)%8 != 0: #不是8的倍数,用空格补全成8的倍数
            text += ' '
        return text
    
    key = b'abcdefgh' # 密钥,一般是8位或16位
    des = DES.new(key,DES.MODE_ECB) #参数 key:密钥 mode:模式一般是DES.MODE_ECB
    text = 'hello world' #要加密的文本
    encrypto_text = des.encrypt(pad(text).encode())# 加密
    print('密文',binascii.b2a_hex(encrypto_text)) #把bytes转成16进制
    
    # 如果不经过pad处理,会报错 :加密的数据不对,必须是密钥的位数的整数倍(此处是8的整数倍)
    data = des.decrypt(encrypto_text).strip() # 会多出来一些字符串,所以要rstrip一下
    # data = des.decrypt(encrypto_text).decode('utf-8')
    print('明文',data)
    

    密文 b'c720e6acbf9f18b072b2abe014f5a6ce'
    明文 b'hello world'

    第四种方法

    from Cryptodome.Cipher import DES
    import binascii
    
    ##第一种方法
    # def pad(text):
    #     while len(text)%8 != 0: #不是8的倍数,用空格补全成8的倍数
    #         text += ' '
    #     return text
    # 密文 b'c720e6acbf9f18b072b2abe014f5a6ce'
    # 明文 b'hello world'
    
    ##第二种方法
    def pad(text):
        text = text.encode()
        result = len(text) %8
        if ( result != 0): #当字节数不是8的倍数时,用字节补全
            text = text + (b''*(16-result))
        return text
    
    key = b'abcdefgh' # 密钥,一般是8位或16位
    des = DES.new(key,DES.MODE_ECB) #参数 key:密钥 mode:模式一般是DES.MODE_ECB
    text = 'hello world' #要加密的文本
    encrypto_text = des.encrypt(pad(text))# 加密  # 原 encrypto_text = des.encrypt(pad(text).encode())
    print('密文',binascii.b2a_hex(encrypto_text)) #把bytes转成16进制
    
    # 如果不经过pad处理,会报错 :加密的数据不对,必须是密钥的位数的整数倍(此处是8的整数倍)
    # data = des.decrypt(encrypto_text).strip() # 会多出来一些字符串,所以要rstrip一下
    # 如果使用rstrip一下,还是这样 b'hello worldx00x00x00x00x00x00x00x00x00x00x00x00x00'
    #就使用以下方法
    data = des.decrypt(encrypto_text).decode('utf-8')
    print('明文',data)
    

    密文 b'c720e6acbf9f18b00bf8f71cb1788adceae5fee8065b2d3a'
    明文 hello world

    AES加密

    第一种方法

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # 安装方法 pip install pycrypto‎demo
    
    from Crypto.Cipher import AES
    from binascii import b2a_hex, a2b_hex
    
    
    class PrpCrypt(object):
    
        def __init__(self, key):
            self.key = key.encode('utf-8')
            self.mode = AES.MODE_CBC
    
        # 加密函数,如果text不足16位就用空格补足为16位,
        # 如果大于16当时不是16的倍数,那就补足为16的倍数。
        def encrypt(self, text):
            text = text.encode('utf-8')
            cryptor = AES.new(self.key, self.mode, b'0000000000000000')
            # 这里密钥key 长度必须为16(AES-128),
            # 24(AES-192),或者32 (AES-256)Bytes 长度
            # 目前AES-128 足够目前使用
            length = 16
            count = len(text)
            if count < length:
                add = (length - count)
                #  backspace
                # text = text + ('' * add)
                text = text + ('' * add).encode('utf-8')
            elif count > length:
                add = (length - (count % length))
                # text = text + ('' * add)
                text = text + ('' * add).encode('utf-8')
            self.ciphertext = cryptor.encrypt(text)
            # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
            # 所以这里统一把加密后的字符串转化为16进制字符串
            return b2a_hex(self.ciphertext)
    
        # 解密后,去掉补足的空格用strip() 去掉
        def decrypt(self, text):
            cryptor = AES.new(self.key, self.mode, b'0000000000000000')
            plain_text = cryptor.decrypt(a2b_hex(text))
            # return plain_text.rstrip('')
            return bytes.decode(plain_text).rstrip('')
    
    if __name__ == '__main__':
        pc = PrpCrypt('aaaabbbbccccdddd')  # 初始化密钥
        e = pc.encrypt("python3python3")  # 加密
        d = pc.decrypt(e)  # 解密
        print("加密:", e)
        print("解密:", d)
    

    第二种方法

    # !/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
     pkcs5补码方式
    """
    
    import base64
    from urllib import parse
    from Crypto.Cipher import AES
    
    
    # 补足字符串长度为16的倍数
    def add_to_16(s):
        while len(s) % 16 != 0:
            s += (16 - len(s) % 16) * chr(16 - len(s) % 16)
        return str.encode(s)  # 返回bytes
    
    # var i = n["default"].enc.Utf8.parse("20171109124536982017110912453698")
    #           , o = n["default"].enc.Utf8.parse("2017110912453698");
    # url=urllib.quote(url).decode('utf8')
    
    key = 'b4688aaaaf17fad03225929fe56ad458'  # 密钥长度必须为16、24或32位,分别对应AES-128、AES-192和AES-256
    text = 'yin1112324'  # 待加密文本
    
    aes = AES.new(str.encode(key), AES.MODE_ECB)  # 初始化加密器,本例采用ECB加密模式
    encrypted_text = str(base64.encodebytes(aes.encrypt(add_to_16(text))), encoding='utf8').replace('
    ', '')  # 加密
    decrypted_text = aes.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).decode("utf8")  # 解密
    decrypted_text = decrypted_text[:-ord(decrypted_text[-1])]  # 去除多余补位
    
    print('pkcs5加密值:', encrypted_text)
    print('pkcs5解密值:', decrypted_text)
    
    

    RSA加密

    第一种方法

    import rsa
    from binascii import a2b_hex,b2a_hex
    
    class rsacrypt():
        def __init__(self):
            self.pub_key,self.priv_key = rsa.newkeys(1024)# 生成公钥和私钥
    
        def rsa_encrypt(self,text):
            self.encrypt_text = rsa.encrypt(text.encode(),self.pub_key)# 此时是bytes
            return b2a_hex(self.encrypt_text) # 转成16进制密文
    
        def rsa_decrypt(self,text):
            self.decrypt_text = rsa.decrypt(a2b_hex(text),self.priv_key) # 把16进制密文转成bytes,然后解密
            return self.decrypt_text.decode()
    
    if __name__ == '__main__':
        rs = rsacrypt()
        text = "hello world"
        en_text = rs.rsa_encrypt(text)
        print('密文:',en_text)
        de_text = rs.rsa_decrypt(en_text)
        print('明文:',de_text)
    

    密文: b'0ecaa6c11e95d1f720ae22d4d80280aa3f28052072773f608bba2c80ee93dfc9cbd5d47c76134c6fec0c26398807b0836e221fdb28eb20bee2d676ebb2c37671c926e11109aa19e1f1ee9e3f2e37e5218b0452390878a4d2aa557aa278462691ff08eababbd02707d7be8e25f6e6b814a88b107f56f8afbb6b7c4d14e9352808'
    明文: hello world

    第二种方法

    #!usr/bin/env/python
    # -*- coding:utf-8 -*-
    
    import rsa
    
    def rsa_encrypt(pwd):
        e = "10001"
        e = int(e, 16)
        n = "ae068c2039bd2d82a529883f273cf20a48e0b6faa564e740402375a9cb332a029b8492ae342893d9c9d53d94d3ab8ae95de9607c2e03dd46cebe211532810b73cc764995ee61ef435437bcddb3f4a52fca66246dbdf2566dd85fbc4930c548e7033c2bcc825b038e8dd4b3553690e0c438bbd5ade6f5a476b1cbc1612f5d501f"
        n= int(n, 16)
        pub_key = rsa.PublicKey(e=e,n=n)
        m = rsa.encrypt(pwd.encode(), pub_key)
        print(m.hex())
    
    
    if __name__ == '__main__':
        pwd = "123456"
        key = rsa_encrypt(pwd)
    
  • 相关阅读:
    dependencyManagement、parent与dependencies
    maven和gradle中,dependency和plugin的区别
    SpringMVC与Struts2区别
    RESTful风格与RESTful Api
    DBCP连接池配置参数
    js 函数的传值问题
    js 重载i
    js 对象与函数的区别
    子窗口 父窗口传值
    验证码
  • 原文地址:https://www.cnblogs.com/gqv2009/p/12681996.html
Copyright © 2011-2022 走看看