打印
[实用程序源码及工具软件]

Python语言调用动态链接库DLL例程源码(独家在21ic发表)

[复制链接]
97|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2023-9-19 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2023-9-22 14:25 编辑

菜农电子淘宝:https://hotcomlock.taobao.com/ 准备出书:http://hotcomlock.com/hotcomlock.html
# -*- coding:utf-8 -*-
#PEA256COMPython.py

import sys
from ctypes import *
import ctypes

def main():
    global PEA256DLL
    print("64位Python!!!")
    PEA256DLL = WinDLL("D:\\libpea256x64\\libpea256x64.dll")#装载64位dll(此处文件路径可由用户根据业务需求自行更改,但务必保证动态库libpea256x64.dll和注册文件pea256.UID.KEY和pea256.REG.KEY必须在同一文件夹下)
    if PEA256DLL:
        #bool PEA256Init(void);//初始化
        PEA256DLL.PEA256Init.restype = ctypes.c_bool
        #HANDLE PEA256Open(void);//创建句柄
        PEA256DLL.PEA256Open.restype = ctypes.c_void_p
        #void PEA256Close(HANDLE handle);//释放句柄
        PEA256DLL.PEA256Close.argtypes = [ctypes.c_void_p]
        #uint32_t PEA256EncryptUserKey(HANDLE handle, const char* keystring, const char* keybuffer,  const char* filename);//设置加密主密钥
        PEA256DLL.PEA256EncryptUserKey.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
        PEA256DLL.PEA256EncryptUserKey.restype = ctypes.c_uint32
        #uint32_t PEA256EncryptBytes(HANDLE handle, uint8_t* bytes, uint32_t length, uint32_t subkey);//句柄流加密
        PEA256DLL.PEA256EncryptBytes.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_uint32, ctypes.c_uint32]
        PEA256DLL.PEA256EncryptBytes.restype = ctypes.c_uint32
        #uint32_t PEA256EncryptBytesEx(HANDLE handle, uint8_t* inbytes, uint8_t* outbytes, uint32_t length, uint32_t subkey);//扩展句柄流加密
        PEA256DLL.PEA256EncryptBytesEx.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_uint32, ctypes.c_uint32]
        PEA256DLL.PEA256EncryptBytesEx.restype = ctypes.c_uint32
        #uint32_t PEA256DecryptUserKey(HANDLE handle, const char* keystring, const char* keybuffer,  const char* filename);//设置解密主密钥
        PEA256DLL.PEA256DecryptUserKey.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
        PEA256DLL.PEA256DecryptUserKey.restype = ctypes.c_uint32
        #uint32_t PEA256DecryptBytes(HANDLE handle, uint8_t* bytes, uint32_t length, uint32_t subkey);//句柄流解密
        PEA256DLL.PEA256DecryptBytes.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_uint32, ctypes.c_uint32]
        PEA256DLL.PEA256DecryptBytes.restype = ctypes.c_uint32
        #uint32_t PEA256DecryptBytesEx(HANDLE handle, uint8_t* inbytes, uint8_t* outbytes, uint32_t length, uint32_t subkey);//扩展句柄流解密
        PEA256DLL.PEA256DecryptBytesEx.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_uint32, ctypes.c_uint32]
        PEA256DLL.PEA256DecryptBytesEx.restype = ctypes.c_uint32
        if PEA256DLL.PEA256Init():#PEA256初始化,只能调用一次!!!
            handle = PEA256DLL.PEA256Open()#打开句柄
            if handle:#打开句柄成功
                Array = bytes([0,1,2,3])#加密解密共用数组
                ArrayEncrypt = bytes([0,1,2,3])#加密专用数组(明文存放区域)
                ArrayDecrypt = bytes([0,1,2,3])#解密专用数组(密文存放区域)
                subkey = PEA256DLL.PEA256EncryptUserKey(handle, "123".encode('gbk'), "".encode('gbk'), "".encode('gbk'))#主密钥为字符串"123",返回子密钥subkey(可以自定义,但必须与解密的子密钥同步)
                subkey = PEA256DLL.PEA256EncryptBytes(handle, Array, 4, subkey)#加密解密共用数组Array,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                subkey = PEA256DLL.PEA256DecryptUserKey(handle, "123".encode('gbk'), "".encode('gbk'), "".encode('gbk'))#主密钥为字符串"123",返回子密钥subkey(可以自定义,但必须与加密的子密钥同步)
                subkey = PEA256DLL.PEA256DecryptBytes(handle, Array, 4, subkey)#加密解密共用数组Array,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                sum = 0;
                for i in range(4):
                    sum ^= i ^ Array[i];
                if sum != 0:
                    print("加解密1错误!!!")
                else:
                    print("加解密1正确!!!")
                subkey = PEA256DLL.PEA256EncryptUserKey(handle, "".encode('gbk'), "0123456789ABCDEF0123456789ABCDEF".encode('gbk'), "".encode('gbk'))#主密钥为固定32个字节首字节非零的密钥缓冲区,返回子密钥subkey(可以自定义,但必须与解密的子密钥同步)
                subkey = PEA256DLL.PEA256EncryptBytesEx(handle, ArrayEncrypt, ArrayDecrypt, 4, subkey)#加密解密不共用数组,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                subkey = PEA256DLL.PEA256DecryptUserKey(handle, "".encode('gbk'), "0123456789ABCDEF0123456789ABCDEF".encode('gbk'), "".encode('gbk'))#主密钥为固定32个字节首字节非零的密钥缓冲区,返回子密钥subkey(可以自定义,但必须与加密的子密钥同步)
                subkey = PEA256DLL.PEA256DecryptBytesEx(handle, ArrayDecrypt, ArrayEncrypt, 4, subkey)#加密解密不共用数组,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                sum = 0;
                for i in range(4):
                    sum ^= i ^ ArrayEncrypt[i];
                if sum != 0:
                    print("加解密2错误!!!")
                else:
                    print("加解密2正确!!!")
                subkey = PEA256DLL.PEA256EncryptUserKey(handle, "".encode('gbk'), "".encode('gbk'), "123.PEA.KEY".encode('gbk'))#主密钥为随机密钥格式文件123.PEA.KEY(不存在自动随机生成),返回子密钥subkey(可以自定义,但必须与解密的子密钥同步)
                subkey = PEA256DLL.PEA256EncryptBytesEx(handle, ArrayEncrypt, ArrayEncrypt, 4, subkey)#加密解密共用数组ArrayEncrypt,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                subkey = PEA256DLL.PEA256DecryptUserKey(handle, "".encode('gbk'), "".encode('gbk'), "123.PEA.KEY".encode('gbk'))#主密钥为随机密钥格式文件123.PEA.KEY(不存在自动随机生成),返回子密钥subkey(可以自定义,但必须与加密的子密钥同步)
                subkey = PEA256DLL.PEA256DecryptBytesEx(handle, ArrayEncrypt, ArrayEncrypt, 4, subkey)#加密解密共用数组ArrayEncrypt,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                sum = 0;
                for i in range(4):
                    sum ^= i ^ ArrayEncrypt[i];
                if sum != 0:
                    print("加解密3错误!!!")
                else:
                    print("加解密3正确!!!")
                subkey = PEA256DLL.PEA256EncryptUserKey(handle, "".encode('gbk'), "".encode('gbk'), "123.TXT".encode('gbk'))#主密钥为任意格式文件123.TXT(前64KB数据有效,文件不存在主密钥为字符串“123.TXT”),返回子密钥subkey(可以自定义,但必须与解密的子密钥同步)
                subkey = PEA256DLL.PEA256EncryptBytesEx(handle, ArrayEncrypt, ArrayDecrypt, 4, subkey)#加密解密不共用数组,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                subkey = PEA256DLL.PEA256DecryptUserKey(handle, "".encode('gbk'), "".encode('gbk'), "123.TXT".encode('gbk'))#主密钥为任意格式文件123.TXT(前64KB数据有效,文件不存在主密钥为字符串“123.TXT”),返回子密钥subkey(可以自定义,但必须与加密的子密钥同步)
                subkey = PEA256DLL.PEA256DecryptBytesEx(handle, ArrayEncrypt, ArrayDecrypt, 4, subkey)#加密解密不共用数组,子密钥不级联时,不需要返回值。(级联用于连续数据包加解密时前后有关联的情况;不级联是连续数据包加解密时前后无关联的情况)
                sum = 0;
                for i in range(4):
                    sum ^= i ^ ArrayEncrypt[i];
                if sum != 0:
                    print("加解密4错误!!!")
                else:
                    print("加解密4正确!!!")
                PEA256DLL.PEA256Close(handle)#关闭句柄
            else:
                print("\nPEA256Open()失败!!!")
        else:
            print("Registration Failed!!!")#注册失败
    else:
        print("LoadLibrary Failed!!!")#装载动态链接库失败
    print("PEA256COM!!!")
if __name__ == "__main__":
   main()


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1538

主题

21697

帖子

505

粉丝