python 封裝3des加解密庫

2021-07-14 14:04:07 字數 2967 閱讀 1975

最近專案需要用到3des加解密,python寫的3des加密速度太慢,所以考慮用c/c++完成,專案是在linux部署,而linux中openssl中包括3des加密,而且自己寫的肯定沒有大神們都用的openssl好用,所以決定使用openssl中的加密模組。

起初,是想用python直接呼叫,但是需要載入openssl的so庫,並且部署的機器上還得安裝openssl-devel,比較麻煩。而且3des只是openssl其中乙個模組,沒必要把整個openssl都引用,所以決定把其中的3des模組摘出來,編譯成so庫。最後發現,還是編譯成python可識別的c擴充套件比較方便。本文記錄在其中遇到的問題。

第一步:把3des模組,從openssl中摘出來,比較簡單需要一點耐心。3des模組,把這5個函式摘出來即可:des_decrypt3, des_encrypt3, des_encrypt2, des_set_key,des_ecb3_encrypt。要把引用的巨集定義標頭檔案挑出來,基本都在這4個頭檔案中:des.h,e_os2.h,des_locl.h,opensslconf.h。如果有漏掉的,去找出來就行。在這幾個標頭檔案沒用的函式定義,編譯的時候誰出錯,削了誰,注釋掉就行。千萬別自己寫巨集,說不准那就報錯了。

#################des3.c

#include

#include

#include

#include

#include

#include "des3.h"

#include "python.h"

#define len_of_key 24

int get_rand_key(unsigned char *pkey, int len)//unsigned char *pkeyencrpt,

return 0;

}int des_encrypt_3(unsigned char *data, unsigned char *k, unsigned char *en_data, int data_len)

if (null != src)

return 0;

}int des_decrypt_3(unsigned char *data, unsigned char *k, unsigned char *de_data, int data_len)

if (null != src)

return 0;

}static pyobject * des3_get_rand_key(pyobject *self, pyobject *args)

return (pyobject *)py_buildvalue("i", get_rand_key(key, len));

}static pyobject * des3_des_encrypt_3(pyobject *self, pyobject *args)

retval = (pyobject *)py_buildvalue("i", des_encrypt_3(data, key, en_data, data_len));

return retval;

}static pyobject * des3_des_decrypt_3(pyobject *self, pyobject *args)

retval = (pyobject *)py_buildvalue("i", des_decrypt_3(data, key, de_data, data_len));

return retval;

}int test(void)

printf("\n");

unsigned char *key = (unsigned char *)malloc(len_of_key+1);

memset(key, 0, len_of_key+1);

get_rand_key(key, len_of_key);

printf("get_rand_key: \n");

for (i = 0; i < len_of_key; i++)

printf("\n");

int len = (d_len+7)/8*8;

printf("len = %d\n", len);

unsigned char *tmp = (unsigned char *)malloc(len+1);

memset(tmp, 0, len+1);

int res1 = des_encrypt_3(data, key, tmp, d_len);

printf("res1: %d\n", res1);

printf("des_encrypt_3:\n");

for(i = 0; i < len; i++)

printf("\n");

int en_len = strlen((const char *)tmp);

unsigned char *de = (unsigned char *)malloc(en_len+1);

memset(de, 0, en_len+1);

memcpy(de, tmp, en_len);

memset(tmp, 0, len);

int res2 = des_decrypt_3(de, key, tmp, len);

printf("res1: %d\n", res2);

printf("des_decrypt_3:\n");

for(i = 0; i < len; i++)

printf("\n");

//    }

//    fclose(fp);

//    free(data);

//    data = null;

return 0;

}static pyobject *des3_test(pyobject *self, pyobject *args)

static pymethoddef des3methods = ,,,

,,};void initdes3()

#################des3.h

3DES加解密類

using system using system.io using system.security.cryptography using system.text namespace gt.common.des if string isnullorwhitespace siv icryptotran...

Des與3Des加密解密

des和3des演算法 public class des b ret.tostring return ret.tostring 3des加密 金鑰不能每8位重複,例如 123456781234567812345678,如果這樣則演算法退化為des,c 會檢測,不能使用 明文 金鑰 public st...

iOS AES加密 解密 3DES加密 解密

加密步驟 字串經過aes加密得到nsdata型別,然後在對加密後的nsdata型別進行base64轉碼,得出最終的字串。解密步驟 對要解密的字串進行base64解碼,然後進行解密,得出原字串。首先建立乙個nsdata jkencrypt類別,寫完的.件如下 import inte ce nsdata...