zoukankan      html  css  js  c++  java
  • Python中使用AES算法(解决Python2.x和3.x下运行不兼容问题)

    两年前使用python时,碰到2.x下AES加密解密算法代码无法在3.x下顺利运行,花点时间解决了兼容问题,在2.7、3.6、3.7下运行良好。

    Linux系统安装依赖库比较简单,Windows下稍嫌繁琐,装完必须的库也可以正常运行。

    代码整理如下:

    # -*- coding: utf-8 -*-
    
    import base64
    import sys
     
    from Crypto import Random
    from Crypto.Cipher import AES
     
     
    # Author: areful
    # Date: 2017-07-06
    class AESCipher:
     
        def __init__(self, key, iv=Random.new().read(AES.block_size)):
            self.key = key
            self.iv = iv
            self.mode = AES.MODE_CBC
     
            if sys.version > '3':
                self.PY3 = True
            else:
                self.PY3 = False
     
        def encrypt(self, text):
            if self.PY3:
                return self.encrypt36(text)
            else:
                return self.encrypt27(text)
     
        def encrypt27(self, text):
            cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
     
            bs = AES.block_size
            text_length = len(text)
            amount_to_pad = bs - (text_length % bs)
            if amount_to_pad == 0:
                amount_to_pad = bs
            pad = chr(amount_to_pad)
            text1 = text + pad * amount_to_pad
            cipher_text = cipher.encrypt(text1)
            return base64.b64encode(cipher_text)
     
        def encrypt36(self, text):
            cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
     
            bs = AES.block_size
            text_length = len(text.encode('utf-8'))
            amount_to_pad = bs - (text_length % bs)
            if amount_to_pad == 0:
                amount_to_pad = bs
            pad = chr(amount_to_pad)
            text1 = text + pad * amount_to_pad
            cipher_text = cipher.encrypt(text1)
            encrypted_str = str(base64.b64encode(cipher_text), encoding='utf-8')
            return encrypted_str
     
        def decrypt(self, text):
            import base64
            base_text = base64.b64decode(text)
            cipher = AES.new(self.key, self.mode, self.iv)
            plain_text = cipher.decrypt(base_text).decode('utf-8')
            pad = ord(plain_text[-1])
            ne = plain_text[:-pad]
            return ne
     
        @staticmethod
        def pad(s):
            bs = AES.block_size
            return s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
     
        @staticmethod
        def unpad(s):
            return s[0:-ord(s[-1])]
     
        @staticmethod
        def __pad(text):
            text_length = len(text)
            amount_to_pad = AES.block_size - (text_length % AES.block_size)
            if amount_to_pad == 0:
                amount_to_pad = AES.block_size
            pad = chr(amount_to_pad)
            return text + pad * amount_to_pad
     
        @staticmethod
        def __unpad(text):
            pad = ord(text[-1])
            return text[:-pad]
     
        @staticmethod
        def test(key, iv, text):
            cipher = AESCipher(key, iv)
            encrypted_msg = cipher.encrypt(text)
            print(encrypted_msg)
            msg = cipher.decrypt(encrypted_msg)
            print(msg)
     
     
    if __name__ == '__main__':
        AESCipher.test('ABCDEFGHICKLMNOP',
                       bytes(bytearray(b'x01x02x03x04x05x06x07x08x41x42x43x44x45x46x47x48')),
                       'areful.测试文本')
    

      

      

  • 相关阅读:
    Tabular DataStream protocol 协议
    Redis 分片实现 Redis Shard [www]
    进程线程协程那些事儿
    Linux下用freetds执行SQL Server的sql语句和存储过程
    unixODBC
    在linux下有没有什么软件可以连接windows上的MSSQL SERVER
    Nginx使用ssl模块配置HTTPS支持
    谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现
    core dump使用方法、设置、测试用例
    linux下生成core dump文件方法及设置
  • 原文地址:https://www.cnblogs.com/areful/p/10325198.html
Copyright © 2011-2022 走看看