C#如何调用C语言实现的dll?

zhhonghui 2008-10-15 02:29:48
在网上搜索到了一个des加密的c语言实现,
.h文件:

/* d3des.h -
*
* Headers and defines for d3des.c
* Graven Imagery, 1992.
*
* Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge
* (GEnie : OUTER; CIS : [71755,204])
*/

#define D2_DES /* include double-length support */
#define D3_DES /* include triple-length support */

#ifdef D3_DES
#ifndef D2_DES
#define D2_DES /* D2_DES is needed for D3_DES */
#endif
#endif

#define DES_EN0 0 /* MODE == encrypt */
#define DES_DE1 1 /* MODE == decrypt */

/* A useful alias on 68000-ish machines, but NOT USED HERE. */

typedef union {
unsigned long blok[2];
unsigned short word[4];
unsigned char byte[8];
} M68K;

extern void deskey(unsigned char *, short);
/* hexkey[8] MODE
* Sets the internal key register according to the hexadecimal
* key contained in the 8 bytes of hexkey, according to the DES,
* for encryption or decryption according to MODE.
*/

extern void usekey(unsigned long *);
/* cookedkey[32]
* Loads the internal key register with the data in cookedkey.
*/

extern void cpkey(unsigned long *);
/* cookedkey[32]
* Copies the contents of the internal key register into the storage
* located at &cookedkey[0].
*/

extern void des(unsigned char *, unsigned char *);
/* from[8] to[8]
* Encrypts/Decrypts (according to the key currently loaded in the
* internal key register) one block of eight bytes at address 'from'
* into the block at address 'to'. They can be the same.
*/

#ifdef D2_DES

#define desDkey(a,b) des2key((a),(b))
extern void des2key(unsigned char *, short);
/* hexkey[16] MODE
* Sets the internal key registerS according to the hexadecimal
* keyS contained in the 16 bytes of hexkey, according to the DES,
* for DOUBLE encryption or decryption according to MODE.
* NOTE: this clobbers all three key registers!
*/

extern void Ddes(unsigned char *, unsigned char *);
/* from[8] to[8]
* Encrypts/Decrypts (according to the keyS currently loaded in the
* internal key registerS) one block of eight bytes at address 'from'
* into the block at address 'to'. They can be the same.
*/

extern void D2des(unsigned char *, unsigned char *);
/* from[16] to[16]
* Encrypts/Decrypts (according to the keyS currently loaded in the
* internal key registerS) one block of SIXTEEN bytes at address 'from'
* into the block at address 'to'. They can be the same.
*/

extern void makekey(char *, unsigned char *);
/* *password, single-length key[8]
* With a double-length default key, this routine hashes a NULL-terminated
* string into an eight-byte random-looking key, suitable for use with the
* deskey() routine.
*/

#define makeDkey(a,b) make2key((a),(b))
extern void make2key(char *, unsigned char *);
/* *password, double-length key[16]
* With a double-length default key, this routine hashes a NULL-terminated
* string into a sixteen-byte random-looking key, suitable for use with the
* des2key() routine.
*/

#ifndef D3_DES /* D2_DES only */

#define useDkey(a) use2key((a))
#define cpDkey(a) cp2key((a))

extern void use2key(unsigned long *);
/* cookedkey[64]
* Loads the internal key registerS with the data in cookedkey.
* NOTE: this clobbers all three key registers!
*/

extern void cp2key(unsigned long *);
/* cookedkey[64]
* Copies the contents of the internal key registerS into the storage
* located at &cookedkey[0].
*/

#else /* D3_DES too */

#define useDkey(a) use3key((a))
#define cpDkey(a) cp3key((a))

extern void des3key(unsigned char *, short);
/* hexkey[24] MODE
* Sets the internal key registerS according to the hexadecimal
* keyS contained in the 24 bytes of hexkey, according to the DES,
* for DOUBLE encryption or decryption according to MODE.
*/

extern void use3key(unsigned long *);
/* cookedkey[96]
* Loads the 3 internal key registerS with the data in cookedkey.
*/

extern void cp3key(unsigned long *);
/* cookedkey[96]
* Copies the contents of the 3 internal key registerS into the storage
* located at &cookedkey[0].
*/

extern void make3key(char *, unsigned char *);
/* *password, triple-length key[24]
* With a triple-length default key, this routine hashes a NULL-terminated
* string into a twenty-four-byte random-looking key, suitable for use with
* the des3key() routine.
*/

#endif /* D3_DES */
#endif /* D2_DES */

/* d3des.h V5.09 rwo 9208.04 15:06 Graven Imagery
********************************************************************/
...全文
630 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhhonghui 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wsyskyhorse 的回复:]
这是我程序里用到的代码
[DllImport("DsSlide.dll")]
public static extern int InitFilters();//
dll是原来同事写的
[/Quote]
好像你的这个方法和我现在用的方法也没什么区别啊
zhhonghui 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Odesky 的回复:]
[DllImport("Sign.dll")]

[/Quote]
这个方法我已经用了啊
zhhonghui 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 qche111 的回复:]
建议你使用 Viewdll函数查看器v2.0 这款小工具查看一下dll中相应函数的入口。
[DllImport("des.dll",EntryPoint = "*****")]] //******为查看到的相应函数的入口
private static extern void deskey(string key, short edf);

[/Quote]
痛苦呀,在公司都下载不了这些工具
wsyskyhorse 2008-10-15
  • 打赏
  • 举报
回复
这是我程序里用到的代码
[DllImport("DsSlide.dll")]
public static extern int InitFilters();//
dll是原来同事写的
wsyskyhorse 2008-10-15
  • 打赏
  • 举报
回复
刚看了下,.h文件里有方法声明了
extern void makekey(char *, unsigned char *);
qinhl99 2008-10-15
  • 打赏
  • 举报
回复
private static extern void makekey(string aptr, string kptr);
私有的静态方法,请问您是怎么调的?把调用的代码帖出来看看?
wsyskyhorse 2008-10-15
  • 打赏
  • 举报
回复
LZ,把这个问题发到C++区可能能解决你的问题
我记得在c++代码里需要把方法声明一下,才能使用DllImport
Odesky 2008-10-15
  • 打赏
  • 举报
回复
[DllImport("Sign.dll")]
Odesky 2008-10-15
  • 打赏
  • 举报
回复
[DllImport("Sign.dll")]
qche111 2008-10-15
  • 打赏
  • 举报
回复
建议你使用 Viewdll函数查看器v2.0 这款小工具查看一下dll中相应函数的入口。
[DllImport("des.dll",EntryPoint = "*****")]] //******为查看到的相应函数的入口
private static extern void deskey(string key, short edf);
supawei 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qshzf 的回复:]
仔细研究一下c代码,用c#改写不就得了!!
[/Quote]
程序不大,14都说的一点不错。你都有元码了翻译过来就是了。
还有楼上说的pinvoke也成。
或者你把它包装成支持com的dll。
qshzf 2008-10-15
  • 打赏
  • 举报
回复
仔细研究一下c代码,用c#改写不就得了!!
slimfeng 2008-10-15
  • 打赏
  • 举报
回复
用VC6工具Depends看看dll的函数是否有EntryPoint
slimfeng 2008-10-15
  • 打赏
  • 举报
回复
用VC6工具Depends看看dll的函数是否有EntryPoint
kainster 2008-10-15
  • 打赏
  • 举报
回复
我建议你先自己用C++写个dll,里面弄个无参数的方法,然后试着用现在这个方法调他,看能不能成功
然后再逐步把参数放进去,试成功以后再把其他代码放进去,因为C#与C的数据类型是不一样的,可能会有很多问题
zhhonghui 2008-10-15
  • 打赏
  • 举报
回复
我想将他使用在一个已有的C#项目里头,该怎么办?
我已经尝试的方法是这样的:
使用VC.net 2005新建了一个win32 console Application的dll项目,将这两个文件加入到项目中,并且编译出了des.dll动态库文件。
在C#中这样使用

[DllImport("des.dll", CharSet = CharSet.Auto)]
private static extern void makekey(string aptr, string kptr);

[DllImport("des.dll")]
private static extern void deskey(string key, short edf);

[DllImport("des.dll")]
private static extern void des(string inblock, string outblock);

private string desEncrypt(string src, string key)
{
string dest = "", byKey = "";

makekey(key, byKey);

deskey(byKey, 0);

des(src, dest);

return dest;
}



运行的时候会报错:Unable to find an entry point named 'makekey' in DLL 'des.dll'.
我该怎么搞?
zhhonghui 2008-10-15
  • 打赏
  • 举报
回复
des.c第四部分:
static void D3des(from, into)	/* amateur theatrics */
unsigned char *from; /* unsigned char[24] */
unsigned char *into; /* unsigned char[24] */
{
unsigned long swap, leftt[2], middl[2], right[2];

scrunch(from, leftt);
scrunch(&from[8], middl);
scrunch(&from[16], right);
desfunc(leftt, KnL);
desfunc(middl, KnL);
desfunc(right, KnL);
swap = leftt[1];
leftt[1] = middl[0];
middl[0] = swap;
swap = middl[1];
middl[1] = right[0];
right[0] = swap;
desfunc(leftt, KnR);
desfunc(middl, KnR);
desfunc(right, KnR);
swap = leftt[1];
leftt[1] = middl[0];
middl[0] = swap;
swap = middl[1];
middl[1] = right[0];
right[0] = swap;
desfunc(leftt, Kn3);
desfunc(middl, Kn3);
desfunc(right, Kn3);
unscrun(leftt, into);
unscrun(middl, &into[8]);
unscrun(right, &into[16]);
return;
}

void make3key(aptr, kptr)
register char *aptr; /* NULL-terminated */
register unsigned char *kptr; /* unsigned char[24] */
{
register unsigned char *store;
register int first, i;
unsigned long savek[96];

cp3key(savek);
des3key(Df_Key, DES_EN0);
for( i = 0; i < 24; i++ ) kptr[i] = Df_Key[i];
first = 1;
while( (*aptr != '\0') || first ) {
store = kptr;
for( i = 0; i < 24 && (*aptr != '\0'); i++ ) {
*store++ ^= *aptr & 0x7f;
*aptr++ = '\0';
}
D3des(kptr, kptr);
first = 0;
}
use3key(savek);
return;
}

#endif /* D3_DES */
#endif /* D2_DES */

/* Validation sets:
*
* Single-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef
* Plain : 0123 4567 89ab cde7
* Cipher : c957 4425 6a5e d31d
*
* Double-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
* Plain : 0123 4567 89ab cde7
* Cipher : 7f1d 0a77 826b 8aff
*
* Double-length key, double-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
* Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
*
* Triple-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
* Plain : 0123 4567 89ab cde7
* Cipher : de0b 7c06 ae5e 0ed5
*
* Triple-length key, double-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
* Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
*
* d3des V5.0a rwo 9208.07 18:44 Graven Imagery
**********************************************************************/
zhhonghui 2008-10-15
  • 打赏
  • 举报
回复
des.c第三部分:
static void desfunc(block, keys)
register unsigned long *block, *keys;
{
register unsigned long fval, work, right, leftt;
register int round;

leftt = block[0];
right = block[1];
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
right ^= work;
leftt ^= (work << 4);
work = ((leftt >> 16) ^ right) & 0x0000ffffL;
right ^= work;
leftt ^= (work << 16);
work = ((right >> 2) ^ leftt) & 0x33333333L;
leftt ^= work;
right ^= (work << 2);
work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
leftt ^= work;
right ^= (work << 8);
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
work = (leftt ^ right) & 0xaaaaaaaaL;
leftt ^= work;
right ^= work;
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;

for( round = 0; round < 8; round++ ) {
work = (right << 28) | (right >> 4);
work ^= *keys++;
fval = SP7[ work & 0x3fL];
fval |= SP5[(work >> 8) & 0x3fL];
fval |= SP3[(work >> 16) & 0x3fL];
fval |= SP1[(work >> 24) & 0x3fL];
work = right ^ *keys++;
fval |= SP8[ work & 0x3fL];
fval |= SP6[(work >> 8) & 0x3fL];
fval |= SP4[(work >> 16) & 0x3fL];
fval |= SP2[(work >> 24) & 0x3fL];
leftt ^= fval;
work = (leftt << 28) | (leftt >> 4);
work ^= *keys++;
fval = SP7[ work & 0x3fL];
fval |= SP5[(work >> 8) & 0x3fL];
fval |= SP3[(work >> 16) & 0x3fL];
fval |= SP1[(work >> 24) & 0x3fL];
work = leftt ^ *keys++;
fval |= SP8[ work & 0x3fL];
fval |= SP6[(work >> 8) & 0x3fL];
fval |= SP4[(work >> 16) & 0x3fL];
fval |= SP2[(work >> 24) & 0x3fL];
right ^= fval;
}

right = (right << 31) | (right >> 1);
work = (leftt ^ right) & 0xaaaaaaaaL;
leftt ^= work;
right ^= work;
leftt = (leftt << 31) | (leftt >> 1);
work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
right ^= work;
leftt ^= (work << 8);
work = ((leftt >> 2) ^ right) & 0x33333333L;
right ^= work;
leftt ^= (work << 2);
work = ((right >> 16) ^ leftt) & 0x0000ffffL;
leftt ^= work;
right ^= (work << 16);
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
leftt ^= work;
right ^= (work << 4);
*block++ = right;
*block = leftt;
return;
}

#ifdef D2_DES

void des2key(hexkey, mode) /* stomps on Kn3 too */
unsigned char *hexkey; /* unsigned char[16] */
short mode;
{
short revmod;

revmod = (mode == DES_EN0) ? DES_DE1 : DES_EN0;
deskey(&hexkey[8], revmod);
cpkey(KnR);
deskey(hexkey, mode);
cpkey(Kn3); /* Kn3 = KnL */
return;
}

void Ddes(from, into)
unsigned char *from, *into; /* unsigned char[8] */
{
unsigned long work[2];

scrunch(from, work);
desfunc(work, KnL);
desfunc(work, KnR);
desfunc(work, Kn3);
unscrun(work, into);
return;
}

void D2des(from, into)
unsigned char *from; /* unsigned char[16] */
unsigned char *into; /* unsigned char[16] */
{
unsigned long *right, *l1, swap;
unsigned long leftt[2], bufR[2];

right = bufR;
l1 = &leftt[1];
scrunch(from, leftt);
scrunch(&from[8], right);
desfunc(leftt, KnL);
desfunc(right, KnL);
swap = *l1;
*l1 = *right;
*right = swap;
desfunc(leftt, KnR);
desfunc(right, KnR);
swap = *l1;
*l1 = *right;
*right = swap;
desfunc(leftt, Kn3);
desfunc(right, Kn3);
unscrun(leftt, into);
unscrun(right, &into[8]);
return;
}

void makekey(aptr, kptr)
register char *aptr; /* NULL-terminated */
register unsigned char *kptr; /* unsigned char[8] */
{
register unsigned char *store;
register int first, i;
unsigned long savek[96];

cpDkey(savek);
des2key(Df_Key, DES_EN0);
for( i = 0; i < 8; i++ ) kptr[i] = Df_Key[i];
first = 1;
while( (*aptr != '\0') || first ) {
store = kptr;
for( i = 0; i < 8 && (*aptr != '\0'); i++ ) {
*store++ ^= *aptr & 0x7f;
*aptr++ = '\0';
}
Ddes(kptr, kptr);
first = 0;
}
useDkey(savek);
return;
}

void make2key(aptr, kptr)
register char *aptr; /* NULL-terminated */
register unsigned char *kptr; /* unsigned char[16] */
{
register unsigned char *store;
register int first, i;
unsigned long savek[96];

cpDkey(savek);
des2key(Df_Key, DES_EN0);
for( i = 0; i < 16; i++ ) kptr[i] = Df_Key[i];
first = 1;
while( (*aptr != '\0') || first ) {
store = kptr;
for( i = 0; i < 16 && (*aptr != '\0'); i++ ) {
*store++ ^= *aptr & 0x7f;
*aptr++ = '\0';
}
D2des(kptr, kptr);
first = 0;
}
useDkey(savek);
return;
}

#ifndef D3_DES /* D2_DES only */
#ifdef D2_DES /* iff D2_DES! */

void cp2key(into)
register unsigned long *into; /* unsigned long[64] */
{
register unsigned long *from, *endp;

cpkey(into);
into = &into[32];
from = KnR, endp = &KnR[32];
while( from < endp ) *into++ = *from++;
return;
}

void use2key(from) /* stomps on Kn3 too */
register unsigned long *from; /* unsigned long[64] */
{
register unsigned long *to, *endp;

usekey(from);
from = &from[32];
to = KnR, endp = &KnR[32];
while( to < endp ) *to++ = *from++;
cpkey(Kn3); /* Kn3 = KnL */
return;
}

#endif /* iff D2_DES */
#else /* D3_DES too */

static void D3des(unsigned char *, unsigned char *);

void des3key(hexkey, mode)
unsigned char *hexkey; /* unsigned char[24] */
short mode;
{
unsigned char *first, *third;
short revmod;

if( mode == DES_EN0 ) {
revmod = DES_DE1;
first = hexkey;
third = &hexkey[16];
}
else {
revmod = DES_EN0;
first = &hexkey[16];
third = hexkey;
}
deskey(&hexkey[8], revmod);
cpkey(KnR);
deskey(third, mode);
cpkey(Kn3);
deskey(first, mode);
return;
}

void cp3key(into)
register unsigned long *into; /* unsigned long[96] */
{
register unsigned long *from, *endp;

cpkey(into);
into = &into[32];
from = KnR, endp = &KnR[32];
while( from < endp ) *into++ = *from++;
from = Kn3, endp = &Kn3[32];
while( from < endp ) *into++ = *from++;
return;
}

void use3key(from)
register unsigned long *from; /* unsigned long[96] */
{
register unsigned long *to, *endp;

usekey(from);
from = &from[32];
to = KnR, endp = &KnR[32];
while( to < endp ) *to++ = *from++;
to = Kn3, endp = &Kn3[32];
while( to < endp ) *to++ = *from++;
return;
}
chengcantao 2008-10-15
  • 打赏
  • 举报
回复
很好,支持
松花皮蛋 2008-10-15
  • 打赏
  • 举报
回复
你在VC++里把它导出DLL ,C#里[DllImport("xxx.dll")]
public static extern 返回值 函数名(参数)
加载更多回复(5)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧