• python2.7 加密模块 解决各种坑


    1 Python27 安装crypto

    Windows安装

    在Windows上安装的时候直接 pip install pycrypto会报错,参考:http://blog.csdn.net/teloy1989/article/details/72862108

    2.安装 Microsoft Visual C++ 9.0 
    由于直接安装安装Crypto模块 会报错如下:因此需要先安装Microsoft Visual C++ 9.0 
    
    2.1 进入下载网址:https://www.microsoft.com/en-us/download/confirmation.aspx?id=44266,直接下载后点击安装
    

    下载的软件是VCForPython27.msi,安装好后,pip install pycrypto

    2 解决Python27的编码错误

    1 设置代码的格式

    # -*- coding: utf-8 -*-
    
    import sys
    
    reload(sys)
    sys.setdefaultencoding('utf-8')
    

    2 解密的时候遇到问题

    Python2切片无法知己获取字节的值,获取的是hex 16进制,查询16进制转换10进制的时候,用 binascii.a2b_hex报错

    下面自己先获取到最后添加的值,把最后的最编码成utf8,再编码成hex,结果就是hex的字符串,自己写的hexstring2int函数,直接把相应的值转换成数字

        a_end_bytes = result[-1]  # 获取到的最后一个数值
        temp_vlue = a_end_bytes.encode('utf-8')  # 加密的时候 把字节解码成字符串 在这里重新编码成utf-8
        num_value = temp_vlue.encode('hex')  # 将获取到的字符串转换成数字
        res = hexstring2int(num_value) # 将hex转换成数字
        data = result[0:-res] # 获取真实的内容
    
    # -*- coding: utf-8 -*-
    
    import sys
    
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    from Crypto.Cipher import AES
    
    
    def hexstring2int(code):
        if code == '01':
            return 1
        elif code == '02':
            return 2
        elif code == '03':
            return 3
        elif code == '04':
            return 4
        elif code == '05':
            return 5
        elif code == '06':
            return 6
        elif code == '07':
            return 7
        elif code == '08':
            return 8
        elif code == '09':
            return 9
        elif code == '0a':
            return 10
        elif code == '0b':
            return 11
        elif code == '0c':
            return 12
        elif code == '0d':
            return 13
        elif code == '0e':
            return 14
        elif code == '0f':
            return 15
        elif code == '10':
            return 16
    
    
    
    def encrypt(message):
        key = b'jlaksdflj77asdfh'  # 16个字节或16字节的倍数
        cipher = AES.new(key, AES.MODE_CBC, key)
        byte_data = bytearray(message, encoding='utf8')  # 想要动态修改字节,用bytearray 相当于把字节转换成一个数组
        v1 = len(byte_data)  # 这是要加密的数据的长度 21
        v2 = v1 % 16  # 取余 5
        if v2 == 0:
            v3 = 16
        else:
            v3 = 16 - v2  # 这是要补足的数 11 : 21+11=32 是16的倍数
        for i in range(v3):
            byte_data.append(v3)
        final_data = byte_data.decode('utf-8')  # 把字节解码成字符串
        msg = cipher.encrypt(final_data)  # 进行加密  final_data必须是16个字节或16字节的倍数
        return msg
    
    
    # ############## 解密 ##############
    def decrypt(msg):
        key = b'jlaksdflj77asdfh'  # 需要同样的key 6个字节或16字节的倍数
        cipher = AES.new(key, AES.MODE_CBC, key)
        result = cipher.decrypt(msg)  # 对字节进行解密
        a_end_bytes = result[-1]  # 获取到的最后一个数值
        temp_vlue = a_end_bytes.encode('utf-8')  # 加密的时候 把字节解码成字符串 在这里重新编码成utf-8
        num_value = temp_vlue.encode('hex')  # 将获取到的字符串转换成数字
        res = hexstring2int(num_value) # 将hex转换成数字
        data = result[0:-res] # 获取真实的内容
        return data
    
    
    if __name__ == '__main__':
        msg = encrypt(u"哈哈哈")
        data = decrypt(msg)
        print data
    
    

    参考:
    https://www.cnblogs.com/japhasiac/p/7739846.html

  • 相关阅读:
    [Linux]Vmwaer创建CENTOS7虚拟机[转]
    [游记]二访金陵
    [Android]ADB调试: SecurityException: Injecting to another application requires INJECT_EVENTS permission
    [操作系统]记一次未尽的三星 Galaxy A6s(SM-G6200)刷机过程
    [网络]NAT与内网穿透技术初探【待续】
    结构化系统建模之程序流程图|系统流程图|数据流图
    UML系统建模之用例视图
    [Linux]常用命令之【mkdir/touch/cp/rm/ls/mv】
    [Linux]监控外部用户登录及外部主机连接情况
    [Java SE]Unicode解码
  • 原文地址:https://www.cnblogs.com/Python666/p/7880278.html
Copyright © 2020-2023  润新知