MD5加密算法(2)

2018-11-28 15:49

left = ( ctx->total[0] >>3 ) &0x3F; fill = 64 - left;

ctx->total[0] += length <<3; ctx->total[1] += length >>29;

ctx->total[0] &= 0xFFFFFFFF;

ctx->total[1] += ctx->total[0] < length <<3;

if( left && length >= fill ) {

memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); md5_process( ctx, ctx->buffer ); length -= fill; input += fill; left = 0; }

while( length >= 64 ) {

md5_process( ctx, input ); length -= 64; input += 64; }

if( length ) {

memcpy( (void *) (ctx->buffer + left), (void *) input, length ); } }

static uint8 md5_padding[64] = {

0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

void CMD5::md5_finish( struct md5_context *ctx, uint8 digest[16] ) {

uint32 last, padn; uint8 msglen[8];

PUT_UINT32( ctx->total[0], msglen, 0 ); PUT_UINT32( ctx->total[1], msglen, 4 );

last = ( ctx->total[0] >>3 ) &0x3F;

padn = ( last <56 ) ? ( 56 - last ) : ( 120 - last );

md5_update( ctx, md5_padding, padn ); md5_update( ctx, msglen, 8 );

PUT_UINT32( ctx->state[0], digest, 0 ); PUT_UINT32( ctx->state[1], digest, 4 ); PUT_UINT32( ctx->state[2], digest, 8 ); PUT_UINT32( ctx->state[3], digest, 12 ); }

void MD5::GenerateMD5(unsigned char* buffer,int bufferlen) {

struct md5_context context; md5_starts (&context);

md5_update (&context, buffer, bufferlen); md5_finish (&context,(unsigned char*)m_data); }

MD5::MD5() {

for(int i=0;i<4;i++) m_data[i]=0; }

MD5::MD5(unsigned long* md5src) {

memcpy(m_data,md5src,16); }int _httoi(constchar *value) {

struct CHexMap { char chr; int value; };

constint HexMapL = 16; CHexMap HexMap[HexMapL] = {

{'0', 0}, {'1', 1}, {'2', 2}, {'3', 3}, {'4', 4}, {'5', 5}, {'6', 6}, {'7', 7}, {'8', 8}, {'9', 9},

{'a', 10}, {'b', 11}, {'c', 12}, {'d', 13}, {'e', 14}, {'f', 15} };

//pthread_mutex_lock(&mutexMemory); char *mstr = strdup(value);

//pthread_mutex_unlock(&mutexMemory); char *s = mstr; int result = 0;

if (*s == '0'&& *(s + 1) == 'X') s += 2; bool firsttime = true; while (*s != '/0') {

bool found = false;

for (int i = 0; i < HexMapL; i++) {

if (*s == HexMap[i].chr) {

if (!firsttime) result <<= 4; result |= HexMap[i].value; found = true; break; } }

if (!found) break; s++;

firsttime = false; }

//pthread_mutex_lock(&mutexMemory); free(mstr); //pthread_mutex_unlock(&mutexMemory); return result; }

MD5::MD5(constchar* md5src) {

if (strcmp(md5src,\)==0) {

for(int i=0;i<4;i++) m_data[i]=0; return; }

for(int j = 0; j <16; j++ ) {

char buf[10];

strncpy(buf,md5src,2); md5src+=2;

((unsigned char*)m_data)[j] = _httoi(buf); } }

MD5 MD5::operator +(CMD5 adder) {

unsigned long m_newdata[4]; for(int i=0;i<4;i++)

m_newdata[i]=m_data[i]^(adder.m_data[i]); return MD5(m_newdata); }

bool MD5::operator ==(MD5 cmper) {

return (memcmp(cmper.m_data ,m_data,16)==0); }

//void MD5::operator =(MD5 equer)//{// memcpy(m_data,equer.m_data ,16);//} string MD5::ToString() {

char output[33];

for(int j = 0; j <16; j++ ) {

sprintf( output + j * 2, \, ((unsigned char*)m_data)[j]); }

returnstring(output); }


MD5加密算法(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:斯里兰卡法师梵语楞严咒(汉语注音)+简丰祺版梵语(注释)对照

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: