有懂VB的VC高手没?或者懂VC的VB高手也行。

hylyz 2005-03-18 03:30:39
懂的话帮忙转换成VB代码(内容为SEED加解密函数):

seedx-1.h代码:
#include "seedx.h"
#include "seedx.tab"
//---------------------------------------------------------------------------

/******************* Encryption/Decryption *******************/

#define GetB0(A) ( (BYTE)((A) ) )
#define GetB1(A) ( (BYTE)((A)>> 8) )
#define GetB2(A) ( (BYTE)((A)>>16) )
#define GetB3(A) ( (BYTE)((A)>>24) )

#define SeedRound(L0, L1, R0, R1, K) { \
T0 = R0 ^ (K)[0]; \
T1 = R1 ^ (K)[1]; \
T1 ^= T0; \
T1 = SS0[GetB0(T1)] ^ SS1[GetB1(T1)] ^ \
SS2[GetB2(T1)] ^ SS3[GetB3(T1)]; \
T0 += T1; \
T0 = SS0[GetB0(T0)] ^ SS1[GetB1(T0)] ^ \
SS2[GetB2(T0)] ^ SS3[GetB3(T0)]; \
T1 += T0; \
T1 = SS0[GetB0(T1)] ^ SS1[GetB1(T1)] ^ \
SS2[GetB2(T1)] ^ SS3[GetB3(T1)]; \
T0 += T1; \
L0 ^= T0; L1 ^= T1; \
}


#define EndianChange(dwS) \
( (ROTL((dwS), 8) & (DWORD)0x00ff00ff) | \
(ROTL((dwS), 24) & (DWORD)0xff00ff00) )


/************************ Block Encryption *************************/
void SeedEncrypt(BYTE *pbData, DWORD *pdwRoundKey)
{
DWORD L0, L1, R0, R1, T0, T1, *K = pdwRoundKey;

L0 = ((DWORD *)pbData)[0];
L1 = ((DWORD *)pbData)[1];
R0 = ((DWORD *)pbData)[2];
R1 = ((DWORD *)pbData)[3];
#ifndef BIG_ENDIAN
L0 = EndianChange(L0);
L1 = EndianChange(L1);
R0 = EndianChange(R0);
R1 = EndianChange(R1);
#endif

SeedRound(L0, L1, R0, R1, K ); /* 1 */
SeedRound(R0, R1, L0, L1, K+ 2); /* 2 */
SeedRound(L0, L1, R0, R1, K+ 4); /* 3 */
SeedRound(R0, R1, L0, L1, K+ 6); /* 4 */
SeedRound(L0, L1, R0, R1, K+ 8); /* 5 */
SeedRound(R0, R1, L0, L1, K+10); /* 6 */
SeedRound(L0, L1, R0, R1, K+12); /* 7 */
SeedRound(R0, R1, L0, L1, K+14); /* 8 */
SeedRound(L0, L1, R0, R1, K+16); /* 9 */
SeedRound(R0, R1, L0, L1, K+18); /* 10 */
SeedRound(L0, L1, R0, R1, K+20); /* 11 */
SeedRound(R0, R1, L0, L1, K+22); /* 12 */
#if NoRounds == 16
SeedRound(L0, L1, R0, R1, K+24); /* 13 */
SeedRound(R0, R1, L0, L1, K+26); /* 14 */
SeedRound(L0, L1, R0, R1, K+28); /* 15 */
SeedRound(R0, R1, L0, L1, K+30); /* 16 */
#endif

#ifndef BIG_ENDIAN
L0 = EndianChange(L0);
L1 = EndianChange(L1);
R0 = EndianChange(R0);
R1 = EndianChange(R1);
#endif
((DWORD *)pbData)[0] = R0;
((DWORD *)pbData)[1] = R1;
((DWORD *)pbData)[2] = L0;
((DWORD *)pbData)[3] = L1;
}


/* same as encrypt, except that round keys are applied in reverse order. */
void SeedDecrypt(BYTE *pbData, DWORD *pdwRoundKey)
{
DWORD L0, L1, R0, R1, T0, T1, *K=pdwRoundKey;

L0 = ((DWORD *)pbData)[0];
L1 = ((DWORD *)pbData)[1];
R0 = ((DWORD *)pbData)[2];
R1 = ((DWORD *)pbData)[3];
#ifndef BIG_ENDIAN
L0 = EndianChange(L0);
L1 = EndianChange(L1);
R0 = EndianChange(R0);
R1 = EndianChange(R1);
#endif

#if NoRounds == 16
SeedRound(L0, L1, R0, R1, K+30); /* 1 */
SeedRound(R0, R1, L0, L1, K+28); /* 2 */
SeedRound(L0, L1, R0, R1, K+26); /* 3 */
SeedRound(R0, R1, L0, L1, K+24); /* 4 */
#endif
SeedRound(L0, L1, R0, R1, K+22); /* 5 */
SeedRound(R0, R1, L0, L1, K+20); /* 6 */
SeedRound(L0, L1, R0, R1, K+18); /* 7 */
SeedRound(R0, R1, L0, L1, K+16); /* 8 */
SeedRound(L0, L1, R0, R1, K+14); /* 9 */
SeedRound(R0, R1, L0, L1, K+12); /* 10 */
SeedRound(L0, L1, R0, R1, K+10); /* 11 */
SeedRound(R0, R1, L0, L1, K+ 8); /* 12 */
SeedRound(L0, L1, R0, R1, K+ 6); /* 13 */
SeedRound(R0, R1, L0, L1, K+ 4); /* 14 */
SeedRound(L0, L1, R0, R1, K+ 2); /* 15 */
SeedRound(R0, R1, L0, L1, K+ 0); /* 16 */

#ifndef BIG_ENDIAN
L0 = EndianChange(L0);
L1 = EndianChange(L1);
R0 = EndianChange(R0);
R1 = EndianChange(R1);
#endif
((DWORD *)pbData)[0] = R0;
((DWORD *)pbData)[1] = R1;
((DWORD *)pbData)[2] = L0;
((DWORD *)pbData)[3] = L1;
}



/******************** Key Scheduling **********************/

/* Constants for key schedule:
KC0 = golden ratio; KCi = ROTL(KCi-1, 1) */
#define KC0 0x9e3779b9UL
#define KC1 0x3c6ef373UL
#define KC2 0x78dde6e6UL
#define KC3 0xf1bbcdccUL
#define KC4 0xe3779b99UL
#define KC5 0xc6ef3733UL
#define KC6 0x8dde6e67UL
#define KC7 0x1bbcdccfUL
#define KC8 0x3779b99eUL
#define KC9 0x6ef3733cUL
#define KC10 0xdde6e678UL
#define KC11 0xbbcdccf1UL
#if NoRounds == 16
#define KC12 0x779b99e3UL
#define KC13 0xef3733c6UL
#define KC14 0xde6e678dUL
#define KC15 0xbcdccf1bUL
#endif

#define EncRoundKeyUpdate0(K, A, B, C, D, KC) { \
T0 = A; \
A = (A>>8) ^ (B<<24); \
B = (B>>8) ^ (T0<<24); \
T0 = A + C - KC; \
T1 = B + KC - D; \
(K)[0] = SS0[GetB0(T0)] ^ SS1[GetB1(T0)] ^ \
SS2[GetB2(T0)] ^ SS3[GetB3(T0)]; \
(K)[1] = SS0[GetB0(T1)] ^ SS1[GetB1(T1)] ^ \
SS2[GetB2(T1)] ^ SS3[GetB3(T1)]; \
}


#define EncRoundKeyUpdate1(K, A, B, C, D, KC) { \
T0 = C; \
C = (C<<8) ^ (D>>24); \
D = (D<<8) ^ (T0>>24); \
T0 = A + C - KC; \
T1 = B + KC - D; \
(K)[0] = SS0[GetB0(T0)] ^ SS1[GetB1(T0)] ^ \
SS2[GetB2(T0)] ^ SS3[GetB3(T0)]; \
(K)[1] = SS0[GetB0(T1)] ^ SS1[GetB1(T1)] ^ \
SS2[GetB2(T1)] ^ SS3[GetB3(T1)]; \
}


/* Encryption key schedule */
void SeedEncRoundKey(DWORD *pdwRoundKey, BYTE *pbUserKey)
{
DWORD A, B, C, D, T0, T1, *K=pdwRoundKey;

A = ((DWORD *)pbUserKey)[0];
B = ((DWORD *)pbUserKey)[1];
C = ((DWORD *)pbUserKey)[2];
D = ((DWORD *)pbUserKey)[3];
#ifndef BIG_ENDIAN
A = EndianChange(A);
B = EndianChange(B);
C = EndianChange(C);
D = EndianChange(D);
#endif

T0 = A + C - KC0;
T1 = B - D + KC0;
K[0] = SS0[GetB0(T0)] ^ SS1[GetB1(T0)] ^
SS2[GetB2(T0)] ^ SS3[GetB3(T0)];
K[1] = SS0[GetB0(T1)] ^ SS1[GetB1(T1)] ^
SS2[GetB2(T1)] ^ SS3[GetB3(T1)];

EncRoundKeyUpdate0(K+ 2, A, B, C, D, KC1 );
EncRoundKeyUpdate1(K+ 4, A, B, C, D, KC2 );
EncRoundKeyUpdate0(K+ 6, A, B, C, D, KC3 );
EncRoundKeyUpdate1(K+ 8, A, B, C, D, KC4 );
EncRoundKeyUpdate0(K+10, A, B, C, D, KC5 );
EncRoundKeyUpdate1(K+12, A, B, C, D, KC6 );
EncRoundKeyUpdate0(K+14, A, B, C, D, KC7 );
EncRoundKeyUpdate1(K+16, A, B, C, D, KC8 );
EncRoundKeyUpdate0(K+18, A, B, C, D, KC9 );
EncRoundKeyUpdate1(K+20, A, B, C, D, KC10);
EncRoundKeyUpdate0(K+22, A, B, C, D, KC11);
#if NoRounds == 16
EncRoundKeyUpdate1(K+24, A, B, C, D, KC12);
EncRoundKeyUpdate0(K+26, A, B, C, D, KC13);
EncRoundKeyUpdate1(K+28, A, B, C, D, KC14);
EncRoundKeyUpdate0(K+30, A, B, C, D, KC15);
#endif
}
/************************ END ****************************/
...全文
331 点赞 收藏 23
写回复
23 条回复
hylyz 2005年03月19日
楼上的帮帮我,帮我编译一下。我QQ:944186,我把源程序传给你。
回复 点赞
qyii 2005年03月19日
如果只有头文件,没有源文件,编译当然出错了!呵呵~~
回复 点赞
Gutta 2005年03月19日
supergreenbean(超级绿豆 - 要准备发芽了)
说得对,写成DLL,来调用,比较快速,又不用关心代码转化的问题,只要参数类型和函数功能了解了就可以了。

http://www.xf3924.com/bbk/showbbs.asp?bd=8&id=38&totable=1
里有怎么用VC写DLL,然后VB调用的内容,可以参考一下。
回复 点赞
hylyz 2005年03月18日
我编译老是出错,谁帮我搞一下啊.愿帮忙的加我QQ:944186
回复 点赞
LuBingLin 2005年03月18日
晕,又一个要代码的,累了不想翻了
回复 点赞
是是非非 2005年03月18日
就是,编译成DLL不就搞定了吗?
回复 点赞
supergreenbean 2005年03月18日
看了头昏……建议楼主还是直接编译成DLL文件供VB调用,这样省时省事,效率又高
回复 点赞
hylyz 2005年03月18日
唉,看来CSDN里的大部分人比较自私。

上面的知道这函数哪来的吗?
在一论坛上我找SEED算法,人家给我网址。
我说看不懂,最好有代码。他给写的,不过他只会VC。
回复 点赞
dxj1234 2005年03月18日
这么麻烦谁愿意自找
回复 点赞
hylyz 2005年03月18日
顶到出来为止。
回复 点赞
Featured 2005年03月18日
看见莫依来,也顶一下
回复 点赞
daisy8675 2005年03月18日
mark
回复 点赞
hylyz 2005年03月18日
实在没人愿意转换的话,也请会VC的人把上面几个主要地方说明一下也好。

我自己来写好了。
回复 点赞
hylyz 2005年03月18日
我可不是吓人啊。

在VB里要用到SEED算法,人家好心人帮我写了个函数,可他只会VC,我呢只会VB,没辙了,想有人帮帮我,把上面的VC函数转换成VB就行了。其实不是太难吧,只要能看懂VC,我相信这是件容易的事。
回复 点赞
熊孩子开学喽 2005年03月18日
楼主要干嘛?吓唬人可不用这样吧
回复 点赞
wylcy 2005年03月18日
VB没有移位算法,转换是可以,就是太麻烦了,不如就把上面的代码编译成dll,在VB里调用好了
回复 点赞
hylyz 2005年03月18日
不是MD5,是韩国的SEED算法,没人帮我吗?
回复 点赞
handsomge 2005年03月18日
俺懂VB,俺也用VC,路过,帮顶
回复 点赞
Heister 2005年03月18日
应该是 md5算法吧,晚上 有asp写的,直接拷贝到vb里就行了
回复 点赞
hylyz 2005年03月18日
不能沉啊,再顶一下,睡觉去,希望醒来有人帮我。
回复 点赞
发动态
发帖子
VB基础类
创建于2007-09-28

2744

社区成员

19.7w+

社区内容

VB 基础类
社区公告
暂无公告