请帮忙调试一个程序

浪尖赏花 2013-06-07 04:38:09
我刚接触C++,碰到一个问题,不知道什么原因,还请牛人帮忙指点

我引用的http://code.google.com/p/libsync/source/browse/?r=9#svn%2Ftrunk%253Fstate%253Dclosed这里的md5.h和md5.c

我自己在程序中调用
md5ctx ctx;
md5_init(&ctx);
const uint8_t *buff = "123456";
int len = 6;
md5_update(&ctx, buff, len);
uint8_t digest[16];
md5_final(digest, &ctx);

被加密的值应该是在digest的值,但我打印出来是乱码
...全文
209 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡木疙瘩 2013-06-08
  • 打赏
  • 举报
回复

char const * hex_digitals = "0123456789ABCDEF";
std::string hex_str;
for( int i = 0; i < 4; ++ i )
{
    hex_str.push_back( hex_digitals[ output[i] >> 24 ] );
    hex_str.push_back( hex_digitals[ (output[i] >> 16) & 0x000F ] );
    hex_str.push_back( hex_digitals[ (output[i] >> 8) & 0x000F ] );
    hex_str.push_back( hex_digitals[ output[i] & 0x000F ] );
}
std::cout << hex_str;
浪尖赏花 2013-06-08
  • 打赏
  • 举报
回复
引用 6 楼 u010936098 的回复:
MD5的处理结果是一个16个字节(128位)的二进制数据,你把它当作字符串输出自然会变成乱码。 应该进行Base64编码或十六进制编码后输出。
嗯,是这个问题,我正在想办法转,c++字符串操作真是麻烦,新手伤不起啊
浪尖赏花 2013-06-08
  • 打赏
  • 举报
回复
引用 5 楼 gumh 的回复:
md5_final(digest, &ctx); -> 函數名和參數都搞錯了, 也許你用的是其它版本? md5_finish(&ctx,digest); md5_starts(&ctx); 參考: /* * MD5 final digest */ void md5_finish( md5_context *ctx, unsigned char output[16] );
我用的这个http://code.google.com/p/libsync/source/browse/?r=9#svn%2Ftrunk%253Fstate%253Dclosed
赵4老师 2013-06-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
橡木疙瘩 2013-06-07
  • 打赏
  • 举报
回复
MD5的处理结果是一个16个字节(128位)的二进制数据,你把它当作字符串输出自然会变成乱码。 应该进行Base64编码或十六进制编码后输出。
prajna 2013-06-07
  • 打赏
  • 举报
回复
md5_final(digest, &ctx); -> 函數名和參數都搞錯了, 也許你用的是其它版本? md5_finish(&ctx,digest); md5_starts(&ctx); 參考: /* * MD5 final digest */ void md5_finish( md5_context *ctx, unsigned char output[16] );
浪尖赏花 2013-06-07
  • 打赏
  • 举报
回复
引用 3 楼 LCL_data 的回复:
得看md5_final如何实现的
能帮忙看下吗,md5.h和md5.c应该没问题,应该是我调的问题
十八道胡同 2013-06-07
  • 打赏
  • 举报
回复
得看md5_final如何实现的
赵4老师 2013-06-07
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <memory.h>
const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}};
const unsigned long t[64]={//t[i]=4294967296*fabs(sin(i+1));
 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
};
const int serial[64]={
 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
 1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
 5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9
};
void func(unsigned long& a,
          unsigned long b,
          unsigned long c,
          unsigned long d,
          unsigned long M,
          unsigned long t,
          int s,
          int turn) {
    unsigned long temp;
    switch(turn) {
    case 0:
        temp=(b&c)|((~b)&d);
        break;
    case 1:
        temp=(d&b)|((~d)&c);
        break;
    case 2:
        temp=b^c^d;
        break;
    case 3:
        temp=c^(b|(~d));
        break;
    }
    temp+=M+t+a;
    _asm {
        mov ecx,s
        rol temp,cl
    }
    a=b+temp;
}
void MD512(const unsigned long M[16],unsigned long hash[4]) {
    int i,j,index=0;
    for (i=0;i<4;i++)
        for (j=0;j<4;j++) {
            func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[i][0],i);
            index++;
            func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);
            index++;
            func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);
            index++;
            func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][3],i);
            index++;
        }
}

void MD5(char* M,int nLen,unsigned long output[4]) {
    int i,j;
    unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
    unsigned long hash[4];

    //填充
    __int64 BitsLen=nLen*8;
    int oldlen=nLen;
    while(nLen%64!=56) {
        M[nLen++]=0;
    }
    M[oldlen]=0x80u;
    *(__int64*)(M+nLen)=BitsLen;
    nLen+=8;

    //开始处理分组
    for (i=0;i<nLen;i+=64) {
        memcpy(hash,Hash,sizeof(long)*4);
        MD512((const unsigned long*)&M[i],hash);//处理512bits分组
        for (j=0;j<4;j++)
            Hash[j]+=hash[j];
    }

    //处理输出。
    for (i=0;i<4;i++)
        for (j=3;j>=0;j--) {
            *((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);
        }
}
int main() {
    int i;
    char szMessage[1000]={0};
    printf("input a string:\n>>>");
    scanf("%s",szMessage);
    unsigned long output[4];
    MD5(szMessage,strlen(szMessage),output);
    for (i=0;i<4;i++)
        printf("%08lx",output[i]);
    printf("\n");
    return 0;
}
aaseh 2013-06-07
  • 打赏
  • 举报
回复
脑残了吧,怎么打印的。

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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