最近專案需要用到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...