找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 17297|回复: 2

[转载代码] 用Python的ctypes模块调用libeay32.dll中的若干函数

[复制链接]
发表于 2016-8-31 16:07:28 | 显示全部楼层 |阅读模式
用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文件。

--------------------------------------------------------------------------
  1. RSA        *rsa;
  2. EVP_PKEY   *pkey;

  3. rsa     = RSA_new();
  4. BN_hex2bn( &rsa->n, "0143" );
  5. BN_hex2bn( &rsa->e, "0B" );
  6. pkey    = EVP_PKEY_new();
  7. EVP_PKEY_assign_RSA( pkey, rsa );
  8. pemfile = fopen( "publickey.pem", "wb" );
  9. PEM_write_PUBKEY( pemfile, pkey );
  10. fclose( pemfile );
  11. RSA_free( rsa );
复制代码
--------------------------------------------------------------------------

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

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

  3. import ctypes

  4. so                          = ctypes.cdll.LoadLibrary( 'libeay32.dll' )
  5. cso                         = ctypes.cdll.msvcrt
  6. so.RSA_new.restype          = ctypes.POINTER( ctypes.c_char )
  7. so.EVP_PKEY_assign.argtypes = ( ctypes.c_int, ctypes.c_int, ctypes.POINTER( ctypes.c_char ) )
  8. so.RSA_free.argtypes        = [ ctypes.POINTER( ctypes.c_char ) ]
  9. rsa                         = so.RSA_new()
  10. n                           = "0143"
  11. so.BN_hex2bn( ctypes.byref( rsa.contents, 16 ), n )
  12. e                           = "0B"
  13. so.BN_hex2bn( ctypes.byref( rsa.contents, 20 ), e )
  14. pkey                        = so.EVP_PKEY_new()
  15. so.EVP_PKEY_assign( pkey, 6, rsa )
  16. pemfile                     = cso.fopen( "publickey.pem", "wb" )
  17. so.PEM_write_PUBKEY( pemfile, pkey )
  18. cso.fclose( pemfile )
  19. so.RSA_free( rsa )
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 1

查看全部评分

 楼主| 发表于 2016-8-31 16:08:23 | 显示全部楼层
这c程序员python代码风格
发表于 2016-8-31 17:10:08 | 显示全部楼层
回复 2# codegay

不是还有个Cpy吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:58 , Processed in 0.018908 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表