Sink

沉舟侧畔千帆过

  • 主页
  • 归档
  • 书籍
  • 书签
  • 技能树
  • 工具箱
  • LeetCode
  • 关于我
所有文章 友情链接 +1s

  • 主页
  • 归档
  • 书籍
  • 书签
  • 技能树
  • 工具箱
  • LeetCode
  • 关于我

Python3中使用PolarSSL替换pyDes实现3DES加密

Published on 2014 / 07 / 18 , Updated on 2014 / 10 / 12

背景

pyDES是纯的python DES加密算法实现。系统目前使用PyDES的3DES加密算法,但是性能低下,已成为系统目前的瓶颈,为提高性能,考虑换用C语言实现。

Google C语言的DES实现,PolarSSL排在前面,这是纯C的实现,决定采用。

编译PolarSSL

首先在PolarSSL的网站下载最新的源代码,解压。使用默认的配置文件编译出的结果是静态链接库(.a 文件),我用这个静态库在Python那边的C语言文件编译会失败,所以得编译成动态链接库(.so 文件)。如下修改配置文件:

  1. 打开PolarSSL的 library/Makefile 文件。
  2. 在文件头添加 SHARED = -shared。

然后在PolarSSL目录打开终端,执行

make all

等待编译完成之后执行安装

sudo make install

执行完上条命令之后我们可以看一下效果

ls /usr/local/lib/
ls /usr/local/include/

刚才编译好的文件都在以上目录存在了,这里需要注意,so文件只在 /usr/local/lib 目录下还是不够的,程序运行时会提示缺失,得复制到 /usr/lib 下。

sudo cp /usr/local/lib/libpolarssl.so.7 /usr/lib/

配置Python

按照我之前写的探究:使用C语言扩展Python3写好接口的C文件,源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
  Author : Zhou Cheng (Sink)
  Date : July 17, 2014
*/

#include <Python.h>
#include <polarssl/des.h>

// My C function
void tdes_encrypt(const char *key_in, const char *data, char *dest, const int byte_len) {
    const int KEY_SIZE = 24;
    const int CHUNK_SIZE = 8;

    char key[KEY_SIZE];
    memset(key, 0, KEY_SIZE);
    int len  = (int)strlen(key_in);
    if (len > KEY_SIZE)
        len = KEY_SIZE;
    memcpy(key, key_in, len);

    des3_context ctx;
    des3_set3key_enc(&ctx, (unsigned char *)key);
    int i, j, k;
    for (i = 0, j = byte_len / CHUNK_SIZE, k = 0; i < j; i ++, k += CHUNK_SIZE)  {
        des3_crypt_ecb(&ctx, (unsigned char *)(data + k), (unsigned char *)(dest + k));
    }
}

// python extending with c function
static PyObject *
triple_des_encrypt(PyObject *self, PyObject *args) {
    char *key;
    char *data;
    if (!PyArg_ParseTuple(args, "ss", &key, &data)) 
        return NULL;
    
    int cur_len, new_len;
    int i, j;
    i = strlen(data);
    j = i / 8;
    if (i % 8)
        j ++;
    cur_len = i;
    new_len = j * 8;
    char *input = (char *)malloc(new_len);
    char *output = (char *)malloc(new_len);
    memset(input, '\0', new_len);
    memset(output, '\0', new_len);
    memcpy(input, data, cur_len);
    tdes_encrypt(key, input, output, new_len);

    PyObject *result = Py_BuildValue("y#", output, new_len);
    free(input);
    free(output);
    return result;
}

// method table
static PyMethodDef DemoMethods[] = {
    {"tdes_encrypt", triple_des_encrypt, METH_VARARGS, NULL},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

// The method table must be referenced in the module definition structure.
static struct PyModuleDef demomodule = {
    PyModuleDef_HEAD_INIT,
    "demo",   /* name of module */
    NULL, /* module documentation, may be NULL */
    -1,       /* size of per-interpreter state of the module,
                or -1 if the module keeps state in global variables. */
    DemoMethods
};

// The initialization function must be named PyInit_name()
PyMODINIT_FUNC
PyInit_demo(void)
{
    return PyModule_Create(&demomodule);
}

这里用到了PolarSSL库里面的函数,加密字符串不足8byte的整数倍补0,加密密钥不足24位同样。

接下来配置编译文件 setup.py,在需要添加的库中包含 PolarSSL,代码如下:

1
2
3
4
5
6
7
8
9
10
from distutils.core import setup, Extension

module1 = Extension('demo',
    libraries = ['polarssl'],
    sources = ['demo.c'])

setup (name = '3DES',
    version = '1.0',
    description = 'This is a demo package by Sink',
    ext_modules = [module1])

编译

python3 setup.py build

编译出的 so 文件就可以被调用了。

性能对比

Python随机生成1000条data和key,保证正确的情况下分别调用两个函数测试性能。C语言只要0.02秒,Python则花了182秒,性能差距巨大。测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import pyDes
import demo
import time
from random import Random

def random_str(randomlength=8):
    str = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789!@#$%^&*()_+'
    length = len(chars) - 1
    random = Random()
    for i in range(randomlength):
        str+=chars[random.randint(0, length)]
    return str

def des_encrypt_test(key, data):
    """3des encrypt"""
    if isinstance(key, str):
        key = key.encode('utf-8')
    if isinstance(data, str):
        data = data.encode('utf-8')
    if len(key) < 24:
        key += (24 - len(key)) * b"\0"
    k = pyDes.triple_des(key, pyDes.ECB, pad=b"\0")
    d = k.encrypt(data)
    # print("Encrypted:%r" % binascii.hexlify(d))
    # print("Decrypted:%r" % binascii.hexlify(k.decrypt(d)))
    # print("pre str      :%r" % k.decrypt(d).decode("utf-8"))
    return d

if __name__ == '__main__':
    data = []
    key = []

    # data init
    for x in range(1,1000):
        data.append(random_str(x))
        key.append(random_str(16 + (x % 9)))
        pass

    # Correct
    for x in range(0,999):
        p = des_encrypt_test(key[x], data[x])
        c = demo.tdes_encrypt(key[x], data[x])
        if (p != c):
            print("Error\n")
            print(key[x])
            print(data[x])
            print("\n")
        pass

    # Performance
    st = time.time()
    for x in range(0,999):
        des_encrypt_test(key[x], data[x])
    et = time.time()
    print(" P Time taken:  {0} seconds.".format(et - st))
    st = time.time()
    for x in range(0,999):
        demo.tdes_encrypt(key[x], data[x])
    et = time.time()
    print(" C Time taken:  {0} seconds.".format(et - st))
 # P Time taken:  181.95579504966736 seconds.
 # C Time taken:  0.027108192443847656 seconds.
赏

很惭愧,就做了一点微小的工作

支付宝
微信
  • python
关于
探究:使用C语言扩展Python3
Copyrights © 2009 - 2025 Sink. All Rights Reserved.
Hexo Illya
  • 所有文章
  • 友情链接
  • +1s

tag:

  • ubuntu
  • dns
  • deepin
  • rfc
  • django
  • database
  • work
  • python
  • greenplum
  • postgres
  • how-to
  • linux
  • react
  • firefox
  • nginx
  • vijos
  • go
  • toml
  • tools
  • usaco
  • IPv6
  • gpg

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • Ubuntu 的软件源新格式 —— deb822

    2025-02-06

    #ubuntu

  • 续期过期 GPG 密钥

    2024-03-22

    #gpg

  • PPPoE 拨号配置 IPv6

    2023-06-22

    #IPv6

  • Linux 系统创建加密磁盘并自动挂载

    2023-03-05

    #how-to

  • 2022 总结和 2023 展望

    2023-01-23

  • 🕯

    2022-11-30

  • 比 Nginx 更加有趣的 Caddy!

    2022-10-06

  • MaxCompute 简单调研

    2022-05-29

  • 奈飞文化手册

    2022-05-17

  • 从收藏夹观察网址变化趋势

    2022-04-30

  • 友善度-知乎

    2022-02-12

  • 2022 新年快乐!

    2022-02-01

  • 效率工具推荐

    2021-10-31

  • 庆祝中国共产党成立100周年

    2021-07-01

  • Linux 启动后自动执行命令

    2021-06-27

    #how-to#linux

  • 设置执行 sudo 免密码

    2021-06-27

    #how-to#linux

  • Firefox 首次支持 Linux 上的硬件加速功能

    2021-01-12

    #firefox

  • 密钥文件取舍

    2020-09-11

  • UOS(deepin)20 桌面版体验

    2020-07-14

    #deepin

  • Nginx 调整笔记

    2020-04-10

    #nginx

  • toolbox 的一些更新

    2020-02-10

  • 2020 新年快乐!

    2020-01-01

  • Linux QQ 全新回归

    2019-10-25

    #linux

  • Python 编码风格指南

    2019-10-23

    #python

  • Happy 15th Birthday, Ubuntu!

    2019-10-23

    #ubuntu

  • Greenplum 简单体验

    2019-10-22

    #greenplum#postgres

  • deepin V15.11 发布

    2019-07-20

    #deepin

  • 再见,readfree

    2019-07-05

  • 在 deepin 15.10+ 上安装 Python3

    2019-06-25

    #how-to

  • P1005 超长数字串

    2019-05-21

    #vijos#go

  • P1003 等价表达式

    2019-05-12

    #vijos#go

  • Django 迁移 Model 到另一个 App

    2019-04-11

    #django#database

  • 年初小站更新记录

    2019-03-05

  • 稳定吧,DNS服务器

    2018-12-15

    #ubuntu#dns

  • 如何科学的换灯泡

    2018-11-12

    #how-to

  • Python 依赖管理的未来

    2018-07-09

    #python

  • 套利的常识

    2018-05-28

  • Django collectstatic 改造

    2018-04-14

    #django

  • 初始化 React 项目

    2018-03-25

    #react

  • 人类简史

    2018-02-11

  • 互联网上的日期和时间

    2017-12-08

    #rfc

  • 聊一聊TOML

    2017-11-22

    #toml

  • Nginx 与 Certbot

    2017-11-15

    #nginx

  • Python3 升级注意事项

    2017-08-02

    #python

  • 重启搜狗输入法脚本

    2017-06-21

  • v2ex.com 自动签到

    2017-03-12

  • nginx 和 php-fpm 的 php7.0-fpm.sock Permission denied 错误

    2017-02-25

  • 公司全站部署HTTPS

    2017-01-01

  • 修复Ubuntu和Win10双系统时间差

    2016-12-25

  • Let's Encrypt

    2016-11-03

  • 使用 Docker 搭建 Sentry

    2016-08-20

  • Congratulations Wings!

    2016-08-14

  • CCG 2016

    2016-07-09

  • 统一社会信用代码

    2016-05-25

  • Ubuntu 16.04 LTS 体验

    2016-04-27

  • Apache Kafka Notes

    2016-03-10

  • MongoDB TTL 索引

    2016-02-24

  • Github 离线维护

    2016-01-28

  • 读书笔记:《龙族IV:奥丁之渊》

    2016-01-14

  • 读书笔记:JavaScript入门经典(第5版)

    2016-01-06

  • 读书笔记:Redis入门指南(第2版)

    2015-12-15

  • Vim非root权限保存文件

    2015-12-04

  • Ubuntu 14.04 上搭建 OpenVPN 服务器

    2015-11-18

  • 关闭Ubuntu系统中的访客账户

    2015-11-04

  • Ubuntu 上安装 zsh

    2015-10-23

    #ubuntu#deepin

  • 正则表达式零宽断言

    2015-10-14

  • 读书笔记:《巴菲特像女人》

    2015-09-08

  • 技能树

    2015-09-03

  • 书签

    2015-09-03

  • 服务器禁止使用常规的用户名密码方式登录

    2015-08-14

    #ubuntu

  • PHP 中使用正则表达式的那些坑

    2015-07-27

  • Monit 和 M/Monit 的调教笔记

    2015-07-07

  • 数字指纹用法

    2015-06-24

  • MongoDB从2.6升级到3.0

    2015-05-04

  • Deepin 2014.3 已经发布

    2015-04-28

    #deepin

  • 修复 Openssl FREAK 中间人劫持漏洞

    2015-03-31

  • Python 使用 json 序列化 datetime 类型

    2015-03-22

  • Nginx 下 Typecho 开启伪静态

    2015-02-28

  • 沃通免费SSL证书

    2015-02-27

  • uptime, top 和 htop

    2015-01-20

    #tools

  • Python import this!

    2015-01-10

  • 解决使用秘钥连接提示“Permissions 0755 for '/root/.ssh/id_rsa' are too open. ”问题

    2014-12-16

  • Linux 终端常用快捷键

    2014-12-16

  • 查找 Linux 系统中的占用磁盘空间最大的前10个文件或文件夹

    2014-12-01

  • 数据库事务隔离级别复习

    2014-10-14

  • Ubuntu 编译安装最新版 git

    2014-09-21

  • Ubuntu 升级后字体变难看的解决办法

    2014-08-26

  • git 常用命令

    2014-08-21

  • 解决 git 中文文件名乱码

    2014-08-13

  • Linux 下用 cd 指令打开带空格的文件夹

    2014-08-10

  • 自制 Kindle Paperwhite 漫画

    2014-08-10

  • Ubuntu 安装配置 Java 环境

    2014-07-26

  • 关于

    2014-07-26

  • Python3中使用PolarSSL替换pyDes实现3DES加密

    2014-07-18

    #python

  • 探究:使用C语言扩展Python3

    2014-07-16

    #work#python

  • 2011-8-21 开学这点事

    2011-08-21

  • 淘汰赛制(elimination)

    2010-08-22

  • 说说也会和谐

    2010-07-26

  • 第5次考网络流

    2010-07-25

  • 夏季档 & 秋季档

    2010-07-16

  • 无奈排序和搜索的随机性

    2010-07-16

  • Vijos

    2010-07-05

    #vijos

  • 打酱油之后

    2010-07-04

  • 又到省选

    2010-07-03

  • Angel Beats! 完结

    2010-06-26

  • 龙族·火之晨曦

    2010-06-25

  • 2010年6月15日关于高三的演讲

    2010-06-18

  • 对某些人只想说:“请不要把无知当作是爱国!”

    2010-06-18

  • 早,高三!

    2010-06-17

  • 水考第一天

    2010-06-10

  • 旋风管家

    2010-05-02

  • 灼眼的夏娜

    2010-04-22

  • USACO Section 2.3

    2010-04-18

    #usaco

  • 零之使魔 And 月考后的总结

    2010-04-15

  • USACO —— numtri

    2010-03-31

    #usaco

  • USACO —— milk3

    2010-03-30

    #usaco

  • 《网瘾战争》的桀骜宣言

    2010-03-29

  • 最小费用流问题 —— 负载平衡

    2010-03-28

  • USACO —— ariprog

    2010-03-28

    #usaco

  • 2010地球熄灯一小时

    2010-03-26

  • 几个班级趣事

    2010-03-25

  • 让人想死的量子物理学

    2010-03-11

  • 墨菲定律(Murphy's Law)

    2010-03-05

  • 马太效应(Matthew Effect)

    2010-03-03

  • 完美牛奶(二分图入门)

    2010-02-03

  • USACO: Section 4.2 Drainage Ditches 草地排水

    2010-01-31

    #usaco

  • 寒假 过年

    2010-01-31

  • 山盟虽在,锦书难托 —— 陆游与唐琬

    2009-12-13

  • NOIP2009结束

    2009-11-21

  • 欧拉函数

    2009-11-18

  • 顶级域名注册完成

    2009-11-17

  • 2009年年末,病了

    2009-11-13

  • 康托展开

    2009-11-10

  • 本部的蹂躏之旅

    2009-11-05

  • 用一根葱征服世界的少女——“初音未来”

    2009-11-03

  • 甩葱歌

    2009-11-03

  • P1101 传染病防治

    2009-10-23

    #vijos

  • P1097 合并果子

    2009-10-22

    #vijos

  • P1317 开心的金明

    2009-10-21

    #vijos

  • P1218 数字游戏

    2009-10-21

    #vijos

  • P1347 乘积最大

    2009-10-21

    #vijos

  • P1117 数的划分

    2009-10-20

    #vijos

  • P1143 三取方格数

    2009-10-20

    #vijos

  • NOIP 2008 双栈排序

    2009-09-15

    #vijos

  • NOIP 2007 矩阵取数游戏

    2009-09-15

    #vijos

  • 树形DP 将功补过

    2009-08-04

  • P1484 ISBN号码 解题报告

    2009-05-16

    #vijos

  • P1258 多项式表示 解题报告

    2009-05-16

    #vijos

  • P1098 合唱队形 解题报告

    2009-05-16

    #vijos

  • 通过33题纪念

    2009-05-10

    #vijos

  • P1398 奖学金 解题报告

    2009-05-10

    #vijos

  • P1093 文科生的悲哀 解题报告

    2009-05-05

    #vijos

  • P1096 津津的储蓄计划 解题报告

    2009-05-05

    #vijos

  • P1303 导弹拦截 解题报告

    2009-05-05

    #vijos

  • P1025 小飞侠的游园方案 解题报告

    2009-04-26

    #vijos

  • P1011 清帝之惑之顺治 解题报告

    2009-04-24

    #vijos

  • P1024 卡布列克圆舞曲

    2009-04-19

    #vijos

  • 浮云计算
  • 成成个人学习小站
  • Victor 的自留地
  • amtoaer
  • lxkaka
  • 酷壳CooShell
  • 曜彤.手记

一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的行程。

很惭愧,就做了一点微小的工作,谢谢大家。