# -*- 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()