我的源程序如下,但是总是输出不料结果
#define _WIN32_WINNT 0x0400
#include<windows.h>
#include<iostream.h>
#include <vector>
#include <string>
#include"blue1.h"
#include"resource.h"//using namespace stdtypedef DWORD (*TDeCode) (DWORD);
TDeCode DeCodes;typedef DWORD (*pFreeBuf) (DWORD);
pFreeBuf pFreeBuf1;typedef BYTE* (*TEnCode)(DWORD,DWORD);
TEnCode EnCodes;typedef DWORD (*TCheckSum) (DWORD,BYTE*,DWORD);
TCheckSum CheckSums;typedef BYTE* (*THash_Proc) (DWORD,DWORD);
THash_Proc Hash_Proc;BYTE *BufForRecv;
BYTE ExportKeyBlog[0x4c];HINSTANCE hLib;
HCRYPTPROV hCryptProv1; 
HCRYPTPROV hCryptProv2;
HCRYPTKEY hGenKey1;
HCRYPTKEY hGenKey2;
HCRYPTKEY hImportKey1;
HCRYPTKEY hImportKey2;
HCRYPTKEY hImportKey3;
HCRYPTKEY hXchgKey;
DWORD dwKeyBlobLen;BYTE KeyBlog1[] = {
0x06,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x04,0x00,0x00,
0x01,0x00,0x01,0x00,0xB5,0xF5,0x67,0xC5,0xF1,0x3C,0xDB,0x8C,0xBC,0xE7,0x91,0x75,
0xEB,0x40,0x6B,0xB7,0xDE,0xC7,0x4C,0x8F,0xB5,0x1F,0x9D,0x69,0x77,0x61,0x88,0xF1,
0xE9,0xCF,0xAC,0x40,0x07,0x1A,0x37,0xCD,0x9C,0xCD,0x0C,0xC9,0x96,0x1E,0x3C,0xB6,
0x60,0x18,0x5E,0x23,0x07,0xF0,0x08,0xBB,0x0C,0xFF,0x58,0x39,0xEC,0x7B,0x4F,0xAD,
0xDD,0x75,0xB5,0xCB,0xFA,0x95,0x60,0x2F,0x42,0xE3,0x69,0xBD,0xD3,0x4E,0xA5,0x62,
0x87,0x3E,0x32,0x21,0x43,0xA3,0xCC,0xFE,0xFF,0x1C,0xA6,0x91,0x45,0x99,0x51,0x23,
0xD7,0x8F,0xF6,0x3D,0x80,0xDA,0xF1,0xCC,0xC5,0x32,0x0A,0xD8,0xA3,0x1D,0xAA,0xF8,
0x09,0x8E,0xA5,0x88,0xA5,0x34,0x1B,0x1E,0x97,0x12,0xCF,0x98,0x1E,0xBC,0x9C,0xBA,
0x8E,0x3C,0xFD,0xE1
};BYTE KeyBlog2[] = {
0x01,0x02,0x00,0x00,0x01,0x68,0x00,0x00,0x00,0xA4,0x00,0x00,0x76,0x60,0xBC,0xDA,
0x9D,0x20,0x2E,0xF7,0xCB,0xC3,0xBD,0x5D,0x30,0x62,0x82,0xEC,0x00,0xDE,0xAC,0xAF,
0x67,0xBD,0xC9,0x9A,0x64,0x02,0x45,0x98,0x19,0xE6,0xD0,0x57,0x76,0xF0,0x0A,0xF2,
0x23,0xCC,0x1B,0x77,0x61,0xFA,0x2A,0x27,0x6C,0x3E,0xD1,0x81,0x07,0xF3,0xBF,0x9A,
0x93,0xC1,0x23,0xE9,0xD9,0xA8,0xE2,0x0E,0x96,0x14,0x3A,0x32,0xB1,0x88,0xDD,0xEF,
0xCA,0xF3,0x84,0xE4,0x44,0x13,0x97,0xF0,0x84,0x17,0x28,0xBF,0x6D,0xCE,0x1A,0x7A,
0x07,0x5F,0x12,0x55,0xE3,0x1B,0x32,0x54,0xF7,0xFF,0x20,0x37,0x5B,0x56,0xD0,0x40,
0x25,0xFE,0x81,0xFF,0x48,0x0F,0x8B,0x2B,0xD6,0x05,0x0A,0x2E,0xC8,0xDB,0xDB,0xF4,
0x76,0x1F,0xCE,0xDA,0xA7,0xB7,0x4F,0xBA,0x0E,0x37,0x02,0x00,0x32,0x30,0x30,0x36,
0x2E,0x30,0x34,0x2E,0x32,0x31,0x20,0x31,0x32,0x3A,0x35,0x36,0x3A,0x35,0x34,0x00
};BYTE KeyBlog3[] = {
0x06,0x02,0x00,0x00,0x00,0xA4,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x02,0x00,0x00,
0x01,0x00,0x01,0x00,0x47,0x6D,0x2E,0xA4,0xDA,0x37,0xEB,0xD5,0x35,0xC4,0xFB,0x68,
0x48,0x64,0x3F,0x58,0x4A,0xCA,0x5E,0xAE,0x53,0x48,0xA2,0xB9,0xB3,0xD1,0x4A,0x64,
0x4A,0x34,0x03,0x12,0x94,0xD2,0xF7,0x9A,0x8E,0x8D,0xAB,0x4A,0xFD,0x8F,0xC5,0x47,
0xE7,0xA7,0xDE,0x46,0xF9,0x04,0x01,0x9D,0xAD,0x50,0x27,0x11,0xB7,0xCF,0xF3,0x0E,
0xAA,0x7F,0x78,0xAB
};void asmChangeKeyBlog(BYTE* pKeyBlog);
void initAndCreate();
void DecryptPacks();
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{


DialogBoxParam(hInstance,MAKEINTRESOURCE(ABOX),NULL,AboutDlgProc,NULL);
return 0;}BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
static int    cxChar, cxCaps, cyChar, NUMLINES;
static HWND   hCtrlBlock ;
    BufForRecv = new BYTE[0x10000]; 
memset(BufForRecv, 0, 0x10000);
HDC                   hdc;
TEXTMETRIC  tm ;
// TCHAR* OUTsz[20];
int i;  switch (message)      
 {
 case   WM_INITDIALOG :
   
 initAndCreate();
  hCtrlBlock = GetDlgItem (hDlg, IDC_OUT) ;//该函数用于获取对话框中指定控件的窗口句柄。  return TRUE ; 
 case   WM_COMMAND :
 switch (LOWORD (wParam))  
 {
 case IDC_UseName:
 GetDlgItemText(hDlg,IDC_UseName,(char *) BufForRecv,20);  
 return 0 ;  case IDC_OUT:
 hdc = GetDC (hDlg) ;
                  GetTextMetrics (hdc, &tm) ;
        
          cxChar = tm.tmAveCharWidth ;
        
          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
        
          cyChar = tm.tmHeight + tm.tmExternalLeading ;
                  
   for (i = 0 ; i <20 ; i++)      
   TextOut (hdc, 1, cyChar *i, ( TCHAR *)BufForRecv[i],sizeof (BufForRecv[i]) );
   ReleaseDC (hDlg, hdc) ;
 case   IDOK :
 DecryptPacks();
 SendMessage(hDlg,IDC_OUT,0,0);
 return 0;  case   IDCANCEL :
 delete[] BufForRecv;
 BufForRecv = NULL;
 EndDialog (hDlg, 0) ;
 return TRUE ;
 }
 break ;
 }
        
  return FALSE ;
        
}        
void initAndCreate()
{
BYTE* pTemp;
hLib = LoadLibrary("blue1.dll");
DeCodes = (TDeCode)GetProcAddress( hLib,"DeCode" );
pFreeBuf1 = (pFreeBuf)GetProcAddress( hLib,"FreeBuf" );
EnCodes = (TEnCode)GetProcAddress( hLib,"EnCode" );
CheckSums= (TCheckSum)GetProcAddress( hLib,"CheckSum" );
CryptAcquireContext(&hCryptProv1,NULL,"Microsoft Enhanced Cryptographic Provider v1.0",PROV_RSA_FULL,0xF0000000);

CryptImportKey(hCryptProv1, &KeyBlog1[0], 0x94, 0, 0, &hImportKey1);//导入

CryptGenKey(hCryptProv1,//CSP句柄
AT_KEYEXCHANGE,//创建的密钥对类型为signature key pair
CRYPT_EXPORTABLE,//key类型,这里用默认值
&hGenKey1) ;//创建成功返回新创建的密钥对的句柄
//// 创建随机块加密会话密钥. CryptExportKey(hGenKey1,//需要被导出的密钥句柄
0,//传入的密钥就是用来加密被导出的密钥的。也就是说,被导出的密钥hKey的数据是经过这个密钥
PRIVATEKEYBLOB,//被导出的密钥类型
0,//标志位
0,//保存导出的数据
&dwKeyBlobLen);//输入pbData缓冲区的大小,输出导出数据的长度 
//// 获取默认密钥blob大小, 并分配内存

pTemp = new BYTE [ dwKeyBlobLen ] ;

CryptExportKey(hGenKey1,0,PRIVATEKEYBLOB,0,pTemp,&dwKeyBlobLen);
// 获取默认密钥blob大小, 并分配内存

CryptDestroyKey(hGenKey1);//// 销毁密钥交换密钥

asmChangeKeyBlog(pTemp); CryptImportKey(hCryptProv1,pTemp,dwKeyBlobLen,0,0,&hImportKey2);////导入

delete [] pTemp;

CryptImportKey(hCryptProv1,&KeyBlog2[0],0x8c,hImportKey2,0,&hImportKey3);////导入 if( !CryptAcquireContext(&hCryptProv2,NULL,"Microsoft Enhanced Cryptographic Provider v1.0",PROV_RSA_FULL,0xF0000040) )
MessageBox(NULL,"CryptProv Error",NULL,MB_OK);////创建一个指定名称的钥容器,接着再创建一个签名密钥对,

CryptImportKey(hCryptProv2, &KeyBlog3[0], 0x54, 0, 0, &hXchgKey); if( !CryptGenKey(hCryptProv2,CALG_3DES,0x00C00001,&hGenKey2) ) //// 创建随机块加密会话密钥
MessageBox(NULL,"Cant gen key",NULL,MB_OK);
CryptExportKey(hGenKey2, hXchgKey, SIMPLEBLOB, 0, NULL, &dwKeyBlobLen); 
CryptExportKey(hGenKey2, hXchgKey, SIMPLEBLOB, 0, &ExportKeyBlog[0], &dwKeyBlobLen);
}void asmChangeKeyBlog(BYTE* pKeyBlog)
{
DWORD varEDX = *(DWORD*)pKeyBlog;
BYTE* pTempECX = pKeyBlog+0x10;
DWORD ieax = 0;

do
{
if(ieax)
*(pTempECX+ieax) = 0;
else
*pTempECX = 1;
ieax++;
}
while (ieax<4);

ieax = varEDX;
DWORD iesi = varEDX;

ieax = ieax/16;
iesi = ieax/8;
varEDX = iesi + ieax*2 + 4;
pTempECX += varEDX;
varEDX = 0;

if(ieax>0)
{
do
{
if(varEDX)
*(pTempECX+varEDX) = 0;
else
*pTempECX = 1;
varEDX++;
}
while (varEDX < ieax);
}
pTempECX += ieax;
varEDX = 0;

if(ieax>0)
{
do
{
if(varEDX)
*(pTempECX+varEDX) = 0;
else
*pTempECX = 1;
varEDX++;
}
while (varEDX < ieax);
}

pTempECX = pTempECX + ieax*2;
ieax = 0;

if(iesi>0)
{
do
{
if(ieax)
*(pTempECX+ieax) = 0;
else
*pTempECX = 0;
ieax ++;
}
while (ieax<iesi);
}
}
void DecryptPacks()
{
BYTE* p1;
BYTE* p2;
DWORD dwDecryptLen;

p1 = &BufForRecv[0];
p2 = new BYTE [ *(DWORD*)p1 ];
dwDecryptLen =  *(DWORD*)p1;
CopyMemory(p2,p1+4,dwDecryptLen);
ZeroMemory(p1,dwDecryptLen+4);
CryptDecrypt(hGenKey2,//密鈅句柄
0,//一个可选的散列对象
1,//一个布尔值,此值在最后一块数据块之前保持为FALSE,
0,//标志值
p2,//解密数据的指针
&dwDecryptLen);//缓冲区中待加密字符的数量
CopyMemory(p1,p2,dwDecryptLen);
BufForRecv = p1;
delete [] p2;

}

解决方案 »

  1.   

    什么是你期待的结果?
    在哪一行数据出错?
    blue1.dll是什么?
      

  2.   

    这个程序我的不到转换的结果
    也就是IDC_OUT没有输出
      

  3.   

    DecryptPacks();
    SendMessage(hDlg,IDC_OUT,0,0);
    用VC在SENDMESSAGE下断,结果转不到IDC_OUT 哪儿,帮我看看
      

  4.   

    SendMessage(hDlg,IDC_OUT,0,0); 
    这个sendmessage怎么不能跳到IDC_OUT
      

  5.   

    SendMessage(hDlg, WM_COMMAND, IDC_OUT, 0);
      

  6.   

    这段程序怎么
    SendMessage(hDlg, WM_COMMAND, IDC_OUT, 0);
    SendMessage到IDC_OUT一直循环,没有显示
      

  7.   

    TextOut (hdc, 1, cyChar *i, (TCHAR *)&BufForRecv[i],sizeof (BufForRecv[i]) );
    另外你需要确定BufForRecv中是char型数据。
      

  8.   

    把IDC_OUT里面的绘制代码都移到WM_PAINT里面去做,IDC_OUT里面只负责维护数据,然后执行InvalidateRect以便产生WM_PAINT消息。
    如果绘制代码不放到绘制消息里面,窗口是经不起刷新的。
      

  9.   

    谢谢大家,这是我的错,我没有说明白,我这个程序整个是在一个对话框中的,一个输入框IDC_UseName一个输出IDC_OUT
      

  10.   

    如果是这样你应该在IDC_OUT控件中响应WM_PAINT消息来输出文字(用BeginPaint获取HDC,最后EndPaint)。
      

  11.   

    WM_PAINT不是用于窗口更新吗?请在对话框总怎么使用了
    "如果是这样你应该在IDC_OUT控件中响应WM_PAINT消息来输出文字(用BeginPaint获取HDC,最后EndPaint)。"
      

  12.   

    所有控件都有WindowProc,都接收消息,控件需要刷新时就会收到WM_PAINT消息。
      

  13.   

    所有控件都有WindowProc这是什么意思了
      

  14.   

    Windows系统中的所有窗口和控件都是一个“Window”,每一种Window都是通过RegisterClass(Ex)注册的窗口类,每个窗口类都有自己的名字和窗口函数(WindowProc),通过这个函数接收发给Window的消息然后做出相应的处理(响应消息)。
    如果你对Windows的消息机制完全不了解,还是找本书学习一下吧。
      

  15.   

    我记得是windows wm_paint是对窗口更新的,但是在对话框中,message中,是对对话框中消息循环,如果添加wm_paint怎么添加了,begain是对wm_paint使用的,我就使用的是GetDC我的程序可以显示只不过是显示在运用程序之外去了,而我的程序只是对话框,没有建立窗口啊
      

  16.   

    用GetDC可以显示,但如果没有响应WM_PAINT消息,只要窗口一刷新,你显示的东西就不见了。
    Windows里面所有控件包括对话框都是Window,都有自己的窗口函数,都会收到WM_PAINT消息。