用Python的ctypes模块调用libeay32.dll中的若干函数

Life is short, you need Python - Bruce Eckel
Package Index, Python 3.5.3 documentation
回复
头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 76
注册时间: 2016年08月06日 16:40
来自: [color=red]斜月三星洞[/color]

用Python的ctypes模块调用libeay32.dll中的若干函数

帖子 灵台方寸山 »

用Python的ctypes模块调用libeay32.dll中的若干函数

标题: 用Python的ctypes模块调用libeay32.dll中的若干函数

http://scz.617.cn/python/201604271814.txt

Python 2.7缺省自带ctypes模块,通过它可以用纯Python代码调用外部动态链接库的
导出函数。如果被调函数的返回值、形参类型涉及结构、指针,使用ctypes并不方便,
此时在Python代码中需要以ctypes要求的格式预定义结构及函数原型。如果被调函数
的返回值类型是int,形参类形是各种整型或"char *",使用ctypes倒是挺方便的,
比如kill()、prctl()之流。

下例就是不方便的那种情形,这段C代码的意图是,已知n/e生成pem文件。

--------------------------------------------------------------------------

代码: 全选

RSA        *rsa;
EVP_PKEY   *pkey;

rsa     = RSA_new();
BN_hex2bn( &rsa->n, "0143" );
BN_hex2bn( &rsa->e, "0B" );
pkey    = EVP_PKEY_new();
EVP_PKEY_assign_RSA( pkey, rsa );
pemfile = fopen( "publickey.pem", "wb" );
PEM_write_PUBKEY( pemfile, pkey );
fclose( pemfile );
RSA_free( rsa );
--------------------------------------------------------------------------

代码: 全选

Python的Crypto模块很容易满足原始需求,此处不纠结这个。对于不方便的那种情形,
如果非要试一下ctypes的话,有些汇编级的技巧。

--------------------------------------------------------------------------
#! /usr/bin/env python
# -*- coding: cp936 -*-

import ctypes

so                          = ctypes.cdll.LoadLibrary( 'libeay32.dll' )
cso                         = ctypes.cdll.msvcrt
so.RSA_new.restype          = ctypes.POINTER( ctypes.c_char )
so.EVP_PKEY_assign.argtypes = ( ctypes.c_int, ctypes.c_int, ctypes.POINTER( ctypes.c_char ) )
so.RSA_free.argtypes        = [ ctypes.POINTER( ctypes.c_char ) ]
rsa                         = so.RSA_new()
n                           = "0143"
so.BN_hex2bn( ctypes.byref( rsa.contents, 16 ), n )
e                           = "0B"
so.BN_hex2bn( ctypes.byref( rsa.contents, 20 ), e )
pkey                        = so.EVP_PKEY_new()
so.EVP_PKEY_assign( pkey, 6, rsa )
pemfile                     = cso.fopen( "publickey.pem", "wb" )
so.PEM_write_PUBKEY( pemfile, pkey )
cso.fclose( pemfile )
so.RSA_free( rsa )
--------------------------------------------------------------------------
:crazylaugh3 :oh_no
少发点科普,对中医产业,骗子产业不好。
头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 76
注册时间: 2016年08月06日 16:40
来自: [color=red]斜月三星洞[/color]

Re: 用Python的ctypes模块调用libeay32.dll中的若干函数

帖子 灵台方寸山 »

:holyhigh c 语言的程序员能把python 写成像c的风格
:crazylaugh3 :oh_no
少发点科普,对中医产业,骗子产业不好。
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Re: 用Python的ctypes模块调用libeay32.dll中的若干函数

帖子 523066680 »

这是用来RSA加密吗
头像
灵台方寸山
出类拔萃
出类拔萃
帖子: 76
注册时间: 2016年08月06日 16:40
来自: [color=red]斜月三星洞[/color]

Re: 用Python的ctypes模块调用libeay32.dll中的若干函数

帖子 灵台方寸山 »

ctypes 可以用来调用其它语言库里的东西。
这个DLL好像是带了很多加密解密相关的功能。
:crazylaugh3 :oh_no
少发点科普,对中医产业,骗子产业不好。
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 3 访客