|
我在c语言中对openldap进行操作时在保存用户密码时我用了MD5的算法,其中我查看了phpldapAdmin的php代码发现它的md5密码生成方式是:先加密为md5然后转换成16进制新式再用base64输出,于是我用C语言实现了上述过程,其中md5编码后转换为16进制后的编码与php中的结果是一致的,但是在base64编码后却与php中的编码结果不一致,是否是我的base64编码有问题,高手帮我看看。
以下是我的代码:
php代码
printf("md5=%s\n", md5("123456") );
printf("pack=%s\n",pack( 'H*' , md5("123456") ) );
printf("base=%s\n",base64_encode(pack( 'H*' , md5("123456") ) ) );
c代码:
#include <stdio.h>
#include <openssl/md5.h>
#include <string.h>
#include <stdlib.h>
int Base64Enc(char *buf, char*text,int size) ;
int main()
{
unsigned char result[16];
char rs[33];
char base[64];
MD5_CTX ctx;
char * TEST_STRING = "123456";
MD5_Init(&ctx);
MD5_Update(&ctx, TEST_STRING, strlen(TEST_STRING));
MD5_Final(result, &ctx);
printf("md5= %s\n",result);
sprintf((char*)rs,"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0],result[1],result[2],result[3],result[4],result[5],
result[6],result[7],result[8],result[9],result[10],result[11],
result[12],result[13],result[14],result[15]);
printf("rs= %s\n",rs);
Base64Enc(base,(char*)rs,16);
printf("base= %s\n",base);
}
int Base64Enc(char *buf, char*text,int size)
{
static char *base64_encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int buflen = 0;
while(size>0)
{
*buf++ = base64_encoding[ (text[0] >> 2 ) & 0x3f];
if(size>2)
{
*buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];
*buf++ = base64_encoding[((text[1] & 0xF) << 2) | (text[2] >> 6)];
*buf++ = base64_encoding[text[2] & 0x3F];
}
else
{
switch(size)
{
case 1:
*buf++ = base64_encoding[(text[0] & 3) << 4 ];
*buf++ = '=';
*buf++ = '=';
break;
case 2:
*buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];
*buf++ = base64_encoding[((text[1] & 0x0F) << 2) | (text[2] >> 6)];
*buf++ = '=';
break;
}
}
text +=3;
size -=3;
buflen +=4;
}
*buf = 0;
return buflen;
} |
|