最近开始准备毕业设计,我准备做算法的FPGA硬件加速...想了想,还是选了MD5(虽然被破了)...以前用MD5都是直接用的现成的C++类,由于是针对FPGA硬件的C语言,有很多语言限制(指针限制很大),只好把MD5写一遍.自己写起来还真郁闷,始终结果不对.....郁闷死了,主要部分都是固定的,我写的如下,哪位兄弟帮我瞅瞅啊~~:
第一部分:填充.
len=strlen(instr); //字符串已经读入在char instr[]中
i=len*8; //字符串的bit长度
n=len/64; //
m=len%64;
//填补字符串
if(m!=56)
{
instr[len++]=0x80; //第一bit添1
n=len/64;
m=len%64;
while(m!=56)
{
instr[len++]=0x00; //其余bit添0
n=len/64;
m=len%64;
}
}
(co_int64)instr[len]=i;//最后填充64位的bit长度值
第二部分:
#define f(x,y,z) ((x&y)|((~x)&z))
#define g(x,y,z) ((x&z)|(y&(~z)))
#define h(x,y,z) (x^y^z)
#define i(x,y,z) (y^(x|(~z)))
#define leftrotate(x,n) (((x) << (n))|((x)>>(32-(n))))
#define FF(a, b, c, d, x, s, ac) { \
(a) += f((b),(c),(d))+(x)+(UINT)(ac); \
(a) = leftrotate((a),(s)); \
(a) += (b); \
}
#define GG(a,b,c,d,x,s,ac) { \
(a) += g((b),(c),(d)) + (x) + (UINT)(ac); \
(a) = leftrotate((a),(s)); \
(a) += (b); \
}
#define HH(a,b,c,d,x,s,ac) { \
(a) += h((b),(c),(d)) + (x) + (UINT)(ac); \
(a) = leftrotate((a),(s)); \
(a) += (b); \
}
#define II(a,b,c,d,x,s,ac) { \
(a) += i((b),(c),(d)) + (x) + (UINT)(ac); \
(a) = leftrotate((a),(s)); \
(a) += (b); \
}
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
第三部分:
co_int32 data[MEMORY_SIZE/4]; //co_int32为32位有符号int
offset = 0;
co_memory_readblock(Input, offset, data, mstrlen/4 * sizeof(co_int32));//相当于从填充后的内存块中32位地读入到data数组中
co_int32 aa=0x67452301;
co_int32 bb=0xefcdab89;
co_int32 cc=0x98badcfe;
co_int32 dd=0x10325476;
for ( i = 0; i < (mstrlen/64) ; i++ ) //mstrlen是填充后的byte长度
{
for ( j = 0; j< 16 ;j++)pM[j]=data[i*16+j];
a=aa;
b=bb;
c=cc;
d=dd;
FF (a, b, c, d, pM[ 0], S11, 0xd76aa478); //- 1 -
FF (d, a, b, c, pM[ 1], S12, 0xe8c7b756); //- 2 -
FF (c, d, a, b, pM[ 2], S13, 0x242070db); //- 3 -
FF (b, c, d, a, pM[ 3], S14, 0xc1bdceee); //- 4 -
FF (a, b, c, d, pM[ 4], S11, 0xf57c0faf); //- 5 -
FF (d, a, b, c, pM[ 5], S12, 0x4787c62a); //- 6 -
FF (c, d, a, b, pM[ 6], S13, 0xa8304613); //- 7 -
FF (b, c, d, a, pM[ 7], S14, 0xfd469501); //- 8 -
FF (a, b, c, d, pM[ 8], S11, 0x698098d8); //- 9 -
FF (d, a, b, c, pM[ 9], S12, 0x8b44f7af); //- 10 -
FF (c, d, a, b, pM[10], S13, 0xffff5bb1); //- 11 -
FF (b, c, d, a, pM[11], S14, 0x895cd7be); //- 12 -
FF (a, b, c, d, pM[12], S11, 0x6b901122); //- 13 -
FF (d, a, b, c, pM[13], S12, 0xfd987193); //- 14 -
FF (c, d, a, b, pM[14], S13, 0xa679438e); //- 15 -
FF (b, c, d, a, pM[15], S14, 0x49b40821); //- 16 -
//第二轮--------------------------------->
GG (a, b, c, d, pM[ 1], S21, 0xf61e2562); //- 17 -
GG (d, a, b, c, pM[ 6], S22, 0xc040b340); //- 18 -
GG (c, d, a, b, pM[11], S23, 0x265e5a51); //- 19 -
GG (b, c, d, a, pM[ 0], S24, 0xe9b6c7aa); //- 20 -
GG (a, b, c, d, pM[ 5], S21, 0xd62f105d); //- 21 -
GG (d, a, b, c, pM[10], S22, 0x2441453); //- 22 -
GG (c, d, a, b, pM[15], S23, 0xd8a1e681); //- 23 -
GG (b, c, d, a, pM[ 4], S24, 0xe7d3fbc8); //- 24 -
GG (a, b, c, d, pM[ 9], S21, 0x21e1cde6); //- 25 -
GG (d, a, b, c, pM[14], S22, 0xc33707d6); //- 26 -
GG (c, d, a, b, pM[ 3], S23, 0xf4d50d87); //- 27 -
GG (b, c, d, a, pM[ 8], S24, 0x455a14ed); //- 28 -
GG (a, b, c, d, pM[13], S21, 0xa9e3e905); //- 29 -
GG (d, a, b, c, pM[ 2], S22, 0xfcefa3f8); //- 30 -
GG (c, d, a, b, pM[ 7], S23, 0x676f02d9); //- 31 -
GG (b, c, d, a, pM[12], S24, 0x8d2a4c8a); //- 32 -
//第三轮--------------------------------->
HH (a, b, c, d, pM[ 5], S31, 0xfffa3942); //- 33 -
HH (d, a, b, c, pM[ 8], S32, 0x8771f681); //- 34 -
HH (c, d, a, b, pM[11], S33, 0x6d9d6122); //- 35 -
HH (b, c, d, a, pM[14], S34, 0xfde5380c); //- 36 -
HH (a, b, c, d, pM[ 1], S31, 0xa4beea44); //- 37 -
HH (d, a, b, c, pM[ 4], S32, 0x4bdecfa9); //- 38 -
HH (c, d, a, b, pM[ 7], S33, 0xf6bb4b60); //- 39 -
HH (b, c, d, a, pM[10], S34, 0xbebfbc70); //- 40 -
HH (a, b, c, d, pM[13], S31, 0x289b7ec6); //- 41 -
HH (d, a, b, c, pM[ 0], S32, 0xeaa127fa); //- 42 -
HH (c, d, a, b, pM[ 3], S33, 0xd4ef3085); //- 43 -
HH (b, c, d, a, pM[ 6], S34, 0x4881d05); //- 44 -
HH (a, b, c, d, pM[ 9], S31, 0xd9d4d039); //- 45 -
HH (d, a, b, c, pM[12], S32, 0xe6db99e5); //- 46 -
HH (c, d, a, b, pM[15], S33, 0x1fa27cf8); //- 47 -
HH (b, c, d, a, pM[ 2], S34, 0xc4ac5665); //- 48 -
//第四轮-------------------------------->
II (a, b, c, d, pM[ 0], S41, 0xf4292244); //- 49 -
II (d, a, b, c, pM[ 7], S42, 0x432aff97); //- 50 -
II (c, d, a, b, pM[14], S43, 0xab9423a7); //- 51 -
II (b, c, d, a, pM[ 5], S44, 0xfc93a039); //- 52 -
II (a, b, c, d, pM[12], S41, 0x655b59c3); //- 53 -
II (d, a, b, c, pM[ 3], S42, 0x8f0ccc92); //- 54 -
II (c, d, a, b, pM[10], S43, 0xffeff47d); //- 55 -
II (b, c, d, a, pM[ 1], S44, 0x85845dd1); //- 56 -
II (a, b, c, d, pM[ 8], S41, 0x6fa87e4f); //- 57 -
II (d, a, b, c, pM[15], S42, 0xfe2ce6e0); //- 58 -
II (c, d, a, b, pM[ 6], S43, 0xa3014314); //- 59 -
II (b, c, d, a, pM[13], S44, 0x4e0811a1); //- 60 -
II (a, b, c, d, pM[ 4], S41, 0xf7537e82); //- 61 -
II (d, a, b, c, pM[11], S42, 0xbd3af235); //- 62 -
II (c, d, a, b, pM[ 2], S43, 0x2ad7d2bb); //- 63 -
II (b, c, d, a, pM[ 9], S44, 0xeb86d391); //- 64 -
aa+=a;
bb+=b;
cc+=c;
dd+=d;
}
最后输出aa&bb&cc&dd结果不对???中间哪里有错吗???哪位兄弟帮帮忙啊~~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!