⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qq.cpp

📁 md5 加密算法, 加密原理与具体实现方法!
💻 CPP
字号:
// QQ.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <windows.h>

#include <TCHAR.h>
#include <string.h>
#include "ole2.h"
#include <assert.h>
#include "_md5.h"

void EnumStorage(IStorage *pStg) ;
void DocFileViewer(LPCTSTR lpszPathName);

int main(int argc, char* argv[])
{
	MD5_CTX md5;
	MD5Init(&md5);

	unsigned char encrypt[200];     //存放于加密的信息
	unsigned char decrypt[17];       //存放加密后的结果

	memset(encrypt,0,200);
	memset(decrypt,0,200);
	strcpy((char *)encrypt,"45928963");
	MD5Update(&md5,encrypt,strlen((char *)encrypt));   //对欲加密的字符进行加密
	MD5Final(decrypt,&md5); 

	for(int i=0;i<16;i++)
		printf("%2x ",decrypt[i]);

	printf("\n\nshort: %d\n",sizeof(short));
	printf("int: %d\n",sizeof(int));
	printf("dword: %d\n\n",sizeof(DWORD));
	DocFileViewer("c:\\a1.txt");  
	return 0;
}

void DocFileViewer(LPCTSTR lpszPathName)  
{ 
    ::CoInitialize(NULL); 

    HRESULT hr; 
    IStorage * pStg = NULL; 
     
    hr = ::StgOpenStorage(        // 打开复合文件 
        //L"c:\\a1.stg",        // 文件名称 

		L"d:\\MsgEx.db",
        NULL, 
        STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 
        0, 
        0, 
        &pStg);            // 得到根存储接口指针 

    EnumStorage(pStg);        // 开始枚举 

    if (pStg) 
    { 
        pStg->Release(); 
    } 
    ::CoUninitialize(); 
} 

void EnumStorage(IStorage *pStg) 
{ 
	int count=0;
	char szTemp[1024];
	memset(szTemp,0,1024);
    IEnumSTATSTG * pEnum = NULL;    // 枚举器 
    HRESULT hr; 
    hr = pStg->EnumElements(0, NULL, 0, &pEnum); 
    assert(SUCCEEDED(hr)); 
    STATSTG statstg; 
    IStorage * pStgSub = NULL;    // 子存储接口指针 
	IStream *pStm = NULL;
	unsigned short * p=NULL;
    while (pEnum->Next(1, &statstg, NULL) == NOERROR) 
    { 
		p=statstg.pwcsName;
		for(int i=0;i<wcslen(statstg.pwcsName);i++)
		{
			szTemp[i]=*p++;
		}
		//printf("%s\n",szTemp);

		
		if(!strcmp(szTemp,"Matrix"))
		{
			count=1;
			hr = pStg->OpenStorage(        // 打开子存储 
                statstg.pwcsName, 
                NULL, 
                STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 
                NULL, 
                0, 
                &pStgSub);        // 得到子存储接口指针 

			hr = pStgSub->EnumElements(0, NULL, 0, &pEnum);
			pEnum->Next(1, &statstg, NULL);

			hr = pStgSub->OpenStream(        // 打开子存储 
                statstg.pwcsName, 
                NULL, 
                STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 
                NULL, 
                &pStm); 
			char data[1024];
			
			memset(data,0,1024);
			pStm->Read(data,1024,NULL);
			
			
			data[7]^= data[8];
			//printf("%x\n",0xc4^(data[1] & 0xff));
			//printf("%x\n",0xc4^(data[2] & 0xff));
			//printf("\n\n\n%s\n",data);
			printf("key: %x\n",data[7]);

			printf("\n");
			printf("\n");
			printf("\n");
			for(int i=9;i<710;i++)
			{
				//printf("%2.2x ",(data[i] & 0xff));
				printf("%2.2x ",(~(data[7]^(data[i] & 0xff))  & 0xff));
				//printf("%c",(~(data[7]^data[i])& 0xff)); 
				//printf("%2.2x ",(data[i] & 0xff));
				if(i%10==0)
					printf("\n");
			}
			count=0;
			return;
		}
        switch (statstg.type) 
        { 
	        case STGTY_STORAGE:    // 子存储 
				count++;
		        hr = pStg->OpenStorage(        // 打开子存储 
                statstg.pwcsName, 
                NULL, 
                STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 
                NULL, 
                0, 
                &pStgSub);        // 得到子存储接口指针 

            if (FAILED(hr)) 
            { 
                return; 
            } 
			
            EnumStorage(pStgSub);        // 递归枚举子存储 
            break; 
        case STGTY_STREAM:    // 数据流 
            // ... 
			//printf("2\n");			
			hr = pStg->OpenStream(        // 打开子存储 
                statstg.pwcsName, 
                NULL, 
                STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 
                NULL, 
                &pStm); 
				// 得到子存储接口指针 
			if(count)
			{
				char data[40];
				memset(data,0,40);
				//pStm->Read(data,40,NULL);
				
				//printf("\n\n\n%s\n",data);
				count=0;
			}
            if (FAILED(hr)) 
            { 
                return; 
            } 
            break; 
        } 

        ::CoTaskMemFree(statstg.pwcsName);    // 释放名称所使用的内存 
    } 
     
    if (pEnum) 
    { 
        pEnum->Release(); 
    } 

    if (pStgSub) 
    { 
        pStgSub->Release(); 
    } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -